Mac开发-自定义NSPopover背景色(替换其三角部分)
文章目录
- NSPopover
- 简单使用
- apperance
- 弹出样式 NSPopoverBehavior
- 出现位置
- 分析图层结构
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, //上分
}
这里即MinX即取X轴的最小值,由于Mac坐标系是左下角的,即X轴从左至右,Y轴从下至上
这里的方向应该和坐标系有关,如果视图翻转isFlipped为YES则有可能变化,这里不再验证。
分析图层结构
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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
