macos - 如何防止 macOS 自动将 NSVisualEffectView 插入 NSScrollView
问题描述
我NSView
通过将 aNSStackView
放入NSScroller
. 我以前做过,我的代码是正确的。
视图层次结构是我所期望的,直到第一次通过运行循环(或显示),其中 macOS Catalina(我认为是 Mojave)自动将 aNSVisualEffectView
插入到视图层次结构中。这弄乱了我的自定义绘图无止境..
我创建的层次结构是
NSScrollView -> NSStackView -> stack subviews
这是在第一个显示循环之前由滚动视图“丰富”的:
NSScrollView -> NSClipView -> NSStackView -> stack subviews
并在第一次显示后,将 NSVisualEffects 视图添加到与 NSClipView 相同的级别:
NSScrollView -> NSClipView -> NSStackView -> stack subviews
-> NSVisualEffectsView
有没有办法告诉滚动视图我不想要视觉效果视图?
任何帮助,将不胜感激!
解决方案
当我尝试重新创建聚光灯窗口时,我遇到了同样的问题。下面的屏幕截图显示了视觉效果视图中的表格视图(包含在滚动视图中):
在旧版本的 macOS 中,这里的不透明背景是在滚动视图(或剪辑视图)上绘制的背景,我们可以通过设置清晰的背景颜色或按照 Lucas 的建议设置drawBackground
来简单地将其删除。false
但是,由于在较新版本的 macOS(可能是 Catalina?)中插入了此视觉效果视图,这将不起作用:
它有一个不透明的内容背景材料,我没有找到任何与此行为相关的 API 或文档。
解决方法
对我有用的是在我的NSScrollView
子类中隐藏插入的视觉效果视图:
class ScrollView: NSScrollView {
override func didAddSubview(_ subview: NSView) {
super.didAddSubview(subview)
if subview is NSVisualEffectView {
subview.isHidden = true
}
}
}
更新
如果您使用的是NSTableView
,而不是上面的“hack”,最好将表格视图的样式设置为源列表:
// for macOS 11 Big Sur
tableView.style = .sourceList
// for macOS 10.15 Catalina and older
tableView.selectionHighlightStyle = .sourceList
当您这样做时,系统会自动为源列表外观(或侧边栏)配置滚动视图和表格视图。更具体地说,滚动视图不插入视觉效果视图,表格视图的行视图是半透明的。
推荐阅读
- r - 减少在闪亮仪表板的标题中添加的选择输入的大小
- arrays - 打字稿中递归函数中嵌套数组的正确类型
- ssl - 如何使用 HTTPS 库在 Node.js 中托管具有有效证书的 HTTPS 服务器
- python - 安装 django-tracking 时遇到问题
- flutter - 比较返回函数的值
- python - AWS:如何将一个简单的函数导入为 Lambda 层?
- nginx - 在 Nginx 上运行 fail2ban-regex 时了解 fail2ban 测试输出
- python - 我写的一行代码被标记为“未缩进不匹配任何外部缩进级别”,这是为什么呢?
- angular - 为什么Angular在使用服务时不更新变量或模态但是当我点击页面某处时它工作
- c# - 实例成员的静态成员错误,xUnit