NSPopover
NSPopover
是Mac 10.7 以上的方便彈出控件(10.7之前可以使用這個INPopoverController),需要依賴NSViewController
來使用.
最近需要做一個控件,區別就是背景色不一樣,所以想到了替換其背景色實現。
簡單使用
self.popover = [[NSPopover alloc]init];
self.popover.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua];
self.popover.contentViewController = //你創建的NSViewController;
self.popover.behavior = NSPopoverBehaviorTransient;
[self.popover showRelativeToRect:sender.frame ofView:sender.superview preferredEdge:NSRectEdgeMaxY];
apperance
有以下幾種類別
NSAppearanceNameAqua 10.9之後
NSAppearanceNameDarkAqua 10.14之後
10.10之後
NSAppearanceNameLightContent
NSAppearanceNameVibrantDark //變成黑色背景
NSAppearanceNameVibrantLight //默認
彈出樣式 NSPopoverBehavior
typedef NS_ENUM(NSInteger, NSPopoverBehavior) {
NSPopoverBehaviorApplicationDefined = 0,
NSPopoverBehaviorTransient = 1,
NSPopoverBehaviorSemitransient = 2
};
彈出的效果上沒有什麼區別
NSPopoverBehaviorApplicationDefined
點擊其他地方,不會自動消失。
出現位置
typedef NS_ENUM(NSUInteger, NSRectEdge) {
NSRectEdgeMinX = CGRectMinXEdge, //按鈕右側
NSRectEdgeMinY = CGRectMinYEdge, //上方
NSRectEdgeMaxX = CGRectMaxXEdge, //左側
NSRectEdgeMaxY = CGRectMaxYEdge, //下面
}
分析圖層結構
NSPopover
會將所設置的NSViewController
添加到其內容視圖上
例如我們的NSViewController
的xib內容如下:
最終的彈出的Popover視圖爲:
綠色部分爲NSViewController.view
,紅色部分爲NSPopover
的內容視圖,即我們需要修改NSPopover
的內容視圖的背景色。
通過superview
指針來獲取:
NSView *popoverView = [[[self contentViewController] view] superview];
[popoverView setWantsLayer:YES];
[[popoverView layer] setBackgroundColor:[NSColor colorWithRed:46/255.0 green:53/255.0 blue:59/255.0 alpha:1].CGColor];
最終效果:
代碼地址以及Demo 鏈接:https://pan.baidu.com/s/12JhMecVLhj8LdRuiLt2wCg 密碼:va2y
這樣我們就達到了自定義其背景色的效果
參考文章: https://blog.csdn.net/lovechris00/article/details/77996141
https://stackoverflow.com/questions/19978620/how-to-change-nspopover-background-color-include-triangle-part