【问题标题】:SetNeedsDisplay on NSView triggers the redrawing of the whole views hierarchyNSView 上的 SetNeedsDisplay 触发整个视图层次结构的重绘
【发布时间】:2021-05-31 21:33:05
【问题描述】:
我正在开发一个由 NSWindow 制作的应用程序,它拥有许多自定义子视图,这些子视图可能不透明。
每当我在子视图上调用 SetNeedsDisplay: 或 SetNeedsDisplayInRect: 时,系统都会从父 NSWindows 的内容视图开始调用每个子视图的 drawRect。
如何避免?我怎样才能只重绘脏子视图(它应该是默认行为)?在继承 NSView 时,我可能缺少什么东西吗?还是在设置父 NSWindow 的属性或样式?
谢谢
【问题讨论】:
标签:
macos
cocoa
nsview
setneedsdisplay
setneedsdisplayinrect
【解决方案1】:
可能是不透明的是麻烦的一点。任何非透明视图都会触发整个视图层次结构的重绘,因为窗口必须将该视图背景恢复为原始状态。只有设置为不透明的视图可能不需要重绘它们下面的任何其他内容。但是,如果不透明视图本身被其他视图部分覆盖,它们可能仍会触发“上方”重绘。
【解决方案2】:
好的,我想我已经想通了。似乎将所有子视图转换为支持层的视图就可以了。
这是合理的,给出了由 gpu 管理层的方式以及如何执行层合成。
但是我仍然不明白为什么,使用“经典” NSViews,无论它们是否不透明,兄弟姐妹或孩子,重叠与否,如果没有系统调用重新绘制整个视图,我都无法使单个视图无效查看窗口的层次结构