gpt4 book ai didi

swift - 如何缓存图层内容并在调整大小/动画期间使用它?

转载 作者:行者123 更新时间:2023-11-30 12:07:02 27 4
gpt4 key购买 nike

我注意到,在 macOS 的 Finder 中,当侧边栏折叠/展开时,图标和文本会被压缩或拉伸(stretch)(请参见下面的屏幕截图)。我想这是一种优化,可以防止图层在动画过程中重新绘制。

我尝试编写一个模仿该行为的自定义 NSTableCellView 子类。但我不知道从哪里开始,具体来说:

  1. 如何在动画开始时收到通知,以便我可以设置图层的内容。
  2. 如何在动画完成时重新绘制 View 或图层,以便不再使用缓存的内容。

我从以下脚手架代码开始。 (当 wantsUpdateLayer 返回 true 时,将不会调用 draw(_ dirtyRect: NSRect) 方法。这可能是根据 this doc 进行的优化。 )

     class TableCellView: NSTableCellView {

override func draw(_ dirtyRect: NSRect) {
print(#file, #line, "draw tcell view")
super.draw(dirtyRect)

// Drawing code here.
}

override var wantsUpdateLayer: Bool {
print(#file, #line, "want")
return true
}

override func updateLayer() {
print(#file, #line, "update")
super.updateLayer()
}

}

enter image description here

最佳答案

如果 View 使用图层作为其后备存储 (wantsLayer = true),那么您可以设置 View 的 layerContentsRedrawPolicy执行这些相同的优化。默认情况下(如果 AppKit 创建了该层),在动画调整大小期间,内容将不断重绘到 View 的支持层中:

For a layer-backed view — that is, a view for which AppKit created the layer — AppKit sets the contents redraw policy to duringViewResize by default.

例如,通过将策略设置为 beforeViewResize, View 将在调整大小动画开始时重绘一次。

NSView.LayerContentsRedrawPolicy列出所有可能的重绘策略。

关于swift - 如何缓存图层内容并在调整大小/动画期间使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46561416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com