2017-10-04 34 views
0

我注意到,在macOS的Finder中,當邊欄合攏/展開時,圖標和文本被壓縮或拉伸(請參見下面的截圖)。我想這是一個優化,防止在動畫過程中重新繪製圖層。如何緩存圖層內容並在調整大小/動畫期間使用它?

我試圖編寫一個模仿該行爲的自定義NSTableCellView子類。但我不知道從哪裏開始,具體如下:

  1. 如何在動畫啓動時得到通知,以便我可以設置圖層的內容。
  2. 如何在動畫完成時重新繪製視圖或圖層,以免它再次使用緩存的內容。

我從下面的腳手架代碼開始。 (該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() 
     } 

    } 

enter image description here

回答

0

如果視圖使用一個層作爲它的後備存儲器(wantsLayer = true),則可以設置視圖的layerContentsRedrawPolicy執行這些相同的優化。默認情況下(如果了AppKit創建的層),該內容將被連續動畫大小調整期間重繪到視圖的背襯層:

對於層支持的視圖 - 即,用於該了AppKit創建的層的視圖 - AppKit默認將內容重繪策略設置爲duringViewResize

例如,通過將策略設置爲beforeViewResize,視圖將在調整大小動畫開始時重繪一次。

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

+0

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

相關問題