2010-03-31 83 views
3

我正在使用CALayers繪製到UITableViewCell。我試圖弄清楚圖層是如何與UITableViewCell的內容一起排序的。例如:iPhone CALayer堆棧順序

  1. 我的標籤我cellForRow添加到的UITableViewCell:atIndexPath方法
  2. 在的UITableViewCell的drawRect方法我使用當前上下文得出一些內容
  3. 此外,在drawRect中我添加了一些子層

那麼這些元素的順序是什麼?我知道我在CALayers上有zPosition,但我不確定他們是否總是在UITableViewCell的子視圖之上。我不確定在drawRect中繪製的內容是按順序排列的。任何幫助或文件的鏈接將是偉大的。我已經閱讀了核心動畫編程指南,並沒有看到任何地方這將被回答。

回答

3
  1. 您的UITableViewCell(或派生類)派生自UIView。它擁有一個您可以通過圖層屬性訪問的CALayer。該層佔據了視圖的整個區域。您添加到單元格視圖中的UILabels將是您單元格的UIView的子元素,並且其CALayer將是單元格CALayer的子元素。子圖層在父母面前繪製。
  2. 當您在UIView的drawRect方法中繪製任何東西時,UIView所擁有的CALayer將由位圖支持。你的UILabels會根據它們的大小部分或全部地遮蔽這個位圖。
  3. 以後添加到單元格層的任何小孩CALayers都將成爲UILabel圖層的兄弟,因爲您以後添加了它們,所以默認情況下它們將添加到它們的下方(有些版本可以添加它們來控制排序) 。

請注意,出於性能原因,不建議在同一時間繪製UITableViewCell並使用子視圖。由於相同的原因,建議不要使用4個以上的子視圖/圖層。

+0

因此,那麼可見性的順序是 - 從下到上: UITableViewCell背景位圖 - UITableViewCell.layer - UILabel背景位圖 - UILabel.layer?如果這是真的,那麼UILabel.layer是UITableViewCell.layer的子層? – Brian 2010-03-31 15:28:26

4

CALayers維護層次結構,就像視圖一樣。子圖層在他們的超級圖層前面呈現,全部在層次結構中。 zPosition屬性應該只用於通過放置一個在另一個之上來控制兄弟層的渲染。即使如此,最好還是在sublayers屬性中排列兄弟層(按照它們在該數組內的順序繪製,每個連續圖層都繪製在數組中的前一個圖層上)。

很容易看到這個層次結構,因爲當你在你的代碼中創建它們時,手動向層中添加子層,一直返回到你的UITableViewCell的支持層(層支持的UIView的子類) 。

另外,你真的不應該在其-drawRect:方法中向你的UITableViewCell添加圖層。這應該只用於繪製UITableViewCell的基礎層的內容。在此方法內分配和設置CALayer可能會導致滾動或重繪時顯着減速。你應該只需要在初始化UITableViewCell的某個時刻設置這些圖層,然後在單元重用時更新它們。

+0

我很好奇在哪裏適當的地方是建立我的圖層層次? UITableViewController是否可以將子圖層添加到UITableViewCell.layer?我所擁有的兩層是用CGGradient繪製的單元格的背景,另一層是出現在UITableViewCell上方的圖層。從U62的回答看來,我似乎應該在細胞上畫出梯度。我之前做過,但將其更改爲圖層,因爲我聽說了圖層緩存。漸變上半透明看起來像光澤,但滾動是生澀。 – Brian 2010-03-31 15:38:55

+0

我忘了 - 我也嘗試繪製漸變和存儲爲CGImage layer.contents。但是當我在樂器中使用Core Animation運行時,它顯示漸變仍在混合顏色。 - 感謝你的幫助。 – Brian 2010-03-31 15:41:07

+1

@Brian:層做緩存,但你的意見是層支持。如果每次重用表格視圖單元格時不重繪漸變,則只需在Qua​​rtz的背景視圖中繪製漸變,就不會重繪漸變。但是,如果您正在尋找梯度的高性能實現,您可能需要查看Matt Gallagher的CAGradientLayer示例:http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.html – 2010-03-31 17:02:14