【问题标题】: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,无论它们是否不透明,兄弟姐妹或孩子,重叠与否,如果没有系统调用重新绘制整个视图,我都无法使单个视图无效查看窗口的层次结构

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      相关资源
      最近更新 更多