2014-10-27 66 views
7

應該從drawRect()layoutSubviews()調用CAShapeLayers圖紙嗎?自定義UIView繪圖與layoutSubviews vs drawRect

根據蘋果有關UIViews的文檔,繪圖操作應該放在drawRect()

然而,凱文卡特的WWDC會議中並不是這種情況:What's New in Interface Builder(他演示了在Interface Builder中可訪問的構建自定義UIView的過程)。

在他的演示中,他執行layoutSubviews中的視圖繪製,而不是drawRect

他的解釋是:

如果我要實現的drawRect,這不會讓我們的最佳表現;而使用子層和子視圖將會使我們獲得非常好的表現。

從我迄今爲止在StackOverflow上讀到的內容來看,重寫drawRect()方法可能會導致性能下降。這部分歸因於setNeedsDisplay觸發手動重畫是昂貴的。

但通過Apple文檔和現實世界的應用程序。有意義的是drawRect()應該負責View的繪製,並且layoutSubviews()應該負責處理定位。

回答

1

我會說這取決於。如果你的形狀的大小將依賴於自動佈局系統,那麼在佈局子視圖與繪製矩形中進行繪製可能是有益的。

首先,爲什麼佈局子視圖會有更好的表現?那麼說我有一個UIView(我的父視圖),它繪製了一個使用形狀圖層的圓形視圖(我的子視圖)。該圓的大小由我的父視圖中的寬度和高度約束確定。在父視圖中更改寬度/高度約束時,我只需要重繪該圓。這是一個在佈局子視圖中繪製代碼是有益的實例,因爲我只需要在約束更改時重繪形狀圖層。讓我們來看看自動佈局週期

  1. 更新約束
  2. 佈局子視圖
  3. 渲染視圖

的時候佈局子視圖被稱爲我們知道我們正在使用的幀的大小和可以安全執行我們的繪圖。我知道文檔說你應該使用這種方法來設置框架,邊界等。但是,根據具體情況,在框架內繪製聽起來不合理。

如果圓視圖不依賴於自動佈局系統,並且可以在任何時候更改而不管用戶界面的佈局如何,那麼將繪圖繪製成矩形可能會更好,更新。我認爲這不是一個理想的情況,因爲iOS中的更多用戶界面符合使用自動佈局,因此建議使用佈局子視圖。