我注意到,在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()
}
}
謝謝。我的觀點是分層支持的。我已經注意到這個'layerContentsRedrawPolicy'並試圖將它設置爲'.beforeViewResize'和'crossfade'。它在Sierra上無效。我的另一臺機器已經升級到高級Sierra,我在那臺機器上發現了**,它在層次結構中更高的另一個視圖上有效,但我沒有用'NSTableCellView'嘗試它。在塞拉利昂它沒有效果。我離開了我的High Sierra機器,所以我只能在本週對Sierra進行編碼。 – LShi