背景
- 开发过程中需要自定义下拉框组件。
- macOS上,模态弹窗下再弹出模态弹窗阻塞的问题,导致自定义下拉框组件以window的方式弹出来有问题。所以继续采用系统自带NSPopUpButton(非NSCombox组件,由于NSCombox无法自定义每行Item样式)。
- 使用NSMenuItem自定义Item样式后,发现PopUpButton的非模态弹窗边框样式一直是系统颜色,可能达不到要求。
解决方案
在XCode上查看弹出window的contentView后,可以发现高版本系统(macOS 10.14及以上)contentView为NSVisualEffectView。查看文档后,发现可以通过调整属性以达到相应需求:
- 设置弹窗背景颜色为指定颜色:
[self window].backgroundColor = [NSColor whiteColor];
- 将blendingMode设置NSVisualEffectBlendingModeWithinWindow。默认view与窗口颜色混合。这时颜色就有了变化。
- 在10.14及以上,设置NSVisualEffectView.material=NSVisualEffectMaterialSheet,可以混合为白色。在10.14以下,设置NSVisualEffectView.material=NSVisualEffectMaterialTitlebar,能比较好的达到白色效果。(这里只用白色做实验)
实际测试时,要达到白色效果,这几个都是可以的:
白色:
NSVisualEffectMaterialLight
NSVisualEffectMaterialContentBackground
NSVisualEffectMaterialSheet
NSVisualEffectMaterialHeaderView
浅白色:
NSVisualEffectMaterialTitlebar
NSVisualEffectMaterialPopover
- 最后更新layer:
[NSVisualEffectView updateLayer];
。
图 上方和下方红框部分变为白色,而非系统颜色