我注意到在macOS的Finder中,当侧边栏折叠/展开时,图标和文本会被压缩或拉伸(见下面的屏幕截图)。我想这是一种优化,可以防止图层在动画过程中重新绘制。
我尝试编写一个模仿该行为的自定义NSTableCellView
子类。但我不知道从哪里开始,具体来说:
我从以下脚手架代码开始。 (当draw(_ dirtyRect: NSRect)
返回wantsUpdateLayer
时,系统不会调用true
方法。这可能是根据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()
}
}
答案 0 :(得分:0)
如果视图使用图层作为其后备存储(wantsLayer = true
),则可以设置视图layerContentsRedrawPolicy
以执行这些相同的优化。默认情况下(如果AppKit创建了图层),在动画调整大小期间,内容将不断重新绘制到视图的背景层中:
对于图层支持的视图 - 即AppKit为其创建图层的视图 - 默认情况下,AppKit会将内容重绘策略设置为
duringViewResize
。
例如,将策略设置为beforeViewResize
,视图将在调整大小动画的开头重绘一次。
NSView.LayerContentsRedrawPolicy
列出了所有可能的重绘政策。