Core Animation 文檔翻譯 (第五篇)—構建Layer的層次結構

 

前言


在APP中大多數狀況下,將Layer和View對象結合使用是Layer最好的使用方式。然而,不少時候咱們可能須要經過添加單獨的Layer對象,以便增長視圖繼承層次;當爲了提升性能,或爲了實現View很難實現的特性,此時應該使用Layers,此時也須要知道如何管理咱們建立Layer層次。數組

 

將Layers安插進Layer層次結構裏


Layer層次結構在許多方面都和Views層次結構類似。咱們將一個Layer嵌入到另一個Layer裏面,此時便在被用做嵌入的Layer(被稱爲sublayer)和父圖層(superlayer)之間造成了父子關係;這種父子關係會對
sublayer的許多方面產生影響。例如,它的content處於它superlayer的上面,它的position也會相對於它的superlayer的座標系統,它也會受到被應用到它的superlayer的transforms的影響。app


添加、插入以及移除sublayers


每個Layer對象都有用於添加、插入、移除子layer的方法。表4-1歸納了這些方法和他們的功能。函數

 

Table 4-1 Methods for modifying the layer hierarchy佈局

功能 方法 描述
添加子layer addsubLayer: 爲當前的layer添加一個新的sublayer對象,這個要被添加的sublayer會被添加到當前layer的sublayers數組的末尾。相對於sublayers數組中擁有相同zPosition屬性值的layer,這個新的sublayer將會呈如今他們的頂部。
插入layer insertSublayer:above: insertSublayer:atIndex: insertSublayer:below: 以相對於另外的sublayer的position或者index將sublayer插入sublayer層結構。當要插入到另外的sublayer前面或者後面時候,咱們只須要指定sublayer在數組中的位置。Layers對象是否可顯示在屏幕上,第一取決於他們的zPosition屬性,第二取決於他們在sublayer數組。
移除layers removeFromSuperlayer 從父layer中移除指定的sublayer
交換layers的位置 replaceSublayer:with: 將兩個sublayer的位置進行交換。若是咱們要插入sublayer已經存在於其餘的layer層次結構中了,那麼這個sublayer將會先從以前的層次中移除

對於咱們本身建立的Layer對象,可使用上面的方法;咱們不可使用這些方法調整Layer-backed View 的Layer。可是一個Layer-backed View可以爲咱們單首創建的Layers當作父圖層。性能


爲Sublayers設置位置和尺寸


當添加和插入sublayer的時候,在sublayer顯示到屏幕上以前,咱們必須爲sublayer設置size和position。咱們也能夠在將sublayer添加到圖層上以後再修改size和position,可是咱們最好將在建立Layer的時候就設置這兩個值做爲習慣。動畫

使用bounds屬性能夠設置sublayer的尺寸,使用position屬性能夠
設置sublayer在它的superlayer內的位置。它的bounds的原點一直是(0,0),尺寸size就是咱們設置的大小(以point爲單位)。position屬性適合layer的anchor point相關聯的,anchor point默認是在layer的中心。若是咱們不設置這些值,核心動畫將會設置出事寬高爲0,並設置position爲(0,0)。spa

myLayer.bounds = CGRectMake(0, 0, 100, 100);
myLayer.position = CGPointMake(200, 200);

重要提示:確保layer的寬高爲整數值。(通常咱們使用的值都是以point位單位的而不是pixel,因此至少要保證在當前設備上的爲分辨率的整數個數。)code


Layer的層次是如何影響動畫的


子layer的動畫行爲會受到superlayer的一些屬性的影響。speed屬性就是其中之一,他將會和動畫的speed相乘,這個屬性值默認被設置爲1.0,若改成2.0將會引發動畫以原來速度的2倍運行並以原來一半的時間結束,這個屬性不只僅影響它自身還影響它的sublayers。這個改變是能夠逐層相乘的累積的。若是sublayer和super都被設置爲2.0的speed,sublayer的動畫將會以原速度的4倍運行。
許多layer的調整都會對他包含的sublayers產生相應的影響。例如,對layer使用旋轉transform,則它全部的sublayer也會受到影響。類似的,改變一個layer的opacity屬性也將會影響它的sublayers。layer尺寸的改變遵循佈局規則(Adjusting the Layout of Your Layer Hierarchies.orm


調整Layer層次的佈局


爲了響應superlayer的調整,核心動畫爲調整sublayer的size和position提供幾個配置項。在iOS中layer-backed view的普遍使用是的layer層次的建立顯得沒那麼重要;僅僅支持手動更新layout。對於OSX而言,有幾個可用的配置可以使咱們方便的管理layer層次。對象

Layer的層次layout僅當咱們使用單首創建的Layer對象時纔有意義。若是APP中全部的layer都是和view對應關聯的,可使用基於view的layout實現view響應的變化更新size和position。

 

Sublayers和剪裁


不像Views,一個superLayer不會自動裁剪超過它的bounds矩形區域的sublayers的content。superlayer容許它的sublayers默認徹底不顯示。然而,經過將屬性maksToBunnds的值設爲YES,能夠啓用裁剪操做。

Layer的圓角也被Layer的裁剪遮罩的形狀包含在內。圖4-3顯示了masksToBounds屬性是如何影響帶有圓角的layer的。當masksToBounds屬性被置爲NO的時候,即便sublayer超出了superlayer的bounds,sublayer也會完整的展現。將masksToBounds屬性改成YES將會引發他們sublayer的裁剪。

圖4-3 根據superlayer的bounds裁剪sublayer

 

在兩個Layers中進行座標轉換


有時,咱們須要將一個Layer內的某個點座標值轉化爲屏幕內其餘layer內的座標值。CALayer類提供了幾個簡單的轉換方法:

除了轉換點和矩形值以外,經過使用convertTime:fromLayer:convertTime:toLayer: ,咱們還能在layers之間轉換time值。每個layer都有他們本身的time空間,並使用它的time空間來和系統參考系同步動畫的開始和結束。這些time空間默認是同步的;可是,若是咱們改變一些layer的speed,那麼那些layer的time空間也將會相應的變化。咱們可使用時間轉換方法獲取這些因子,並確保兩個layer的時間函數是同步的。

相關文章
相關標籤/搜索