CoreAnimation编程指南(四)图层树结构
生活随笔
收集整理的這篇文章主要介紹了
CoreAnimation编程指南(四)图层树结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖層不但給自己提供可視化的內容和管理動畫,而且充當了其他圖層的容器類,構建圖層層次結構。? 本章介紹了圖層層次結構,以及如何操縱該圖層層次結構。 ? 一、什么是圖層樹的層次結構
1.圖層樹是核心動畫里面類似Cocoa視圖的層次結構。比如一個NSView或者UIView的實例擁有父視圖(superview)和子視圖(subview),一個核心動畫的圖層擁有父圖層(suplayer)和子圖層(sublayer)。圖層樹和視圖結構一樣提供了很多便利: (1)復雜的接口可以由簡單的圖層來組合,避免了碩大和復雜的繼承化子類。圖層非常合適于這種堆疊方式來合成復雜的功能。 (2)每個圖層定義了一個基于其父圖層的坐標系的坐標系。當一個圖層變換的時候,它的子圖層同樣變換。 (3)一個動態的圖層樹,可以在程序運行的時候重新設置。圖層可以創建并添加為一個圖層的第一個子圖層,然后從其他圖層的圖層樹上面刪除。 ? 二、在視圖里面顯示圖層
1.核心動畫不提供在一個窗口(window)實際顯示圖層的手段,它們必須通過視圖來托管。當視圖和圖層一起的時候,視圖為圖層提供了底層的事件處理,而圖層為視圖提供了顯示的內容。
2.iOS上面的視圖系統直接建立在核心動畫的圖層上面。每個UIView的實例會自動的創建一個CALayer類的實例,然后把該實例賦值給視圖的layer屬性。你可以在需要的時候向視圖的圖層里面添加子圖層。
3.在Mac OS X,您必須配置一個NSView的實例,通過這樣一種方式才可以讓它托管圖層。為了顯示圖層樹的根圖層,你可以設置一個視圖的圖層和配置視圖以便使用圖層: ? 代碼:向view中插入layer ? //theView is an existing view in a window ? //theRootLayer is the root layer of a layer tree ? [theView setLayer: theRootLayer]; ? [theView setWantsLayer:YES]; ?? 三、從圖層結構里面添加和刪除圖層
1.簡單的實例化一個圖層并不意味已經把它插入了一個圖層樹。而是通過以下的方法來實現從圖層樹里面添加、插入、替換和刪除圖層。 (1)addSublayer: ? Appends the layer to the receiver’s sublayers array. (2)insertSublayer:atIndex: ? Inserts the layer as a sublayer of the receiver at the specified index. (3)insertSublayer:below: ? Inserts the layer into the receiver’s sublayers array, below the specified sublayer. (4)insertSublayer:above: ? Inserts the layer into the receiver’s sublayers array, above the specified sublayer. (5)removeFromSuperlayer ? Removes the receiver from the sublayers array or mask property of the receiver’s superlayer. (6)replaceSublayer:with: ? Replaces the layer in the receiver’s sublayers array with the specified new layer. ? 2.你也可以通過使用一個圖層的數組來設置圖層的子圖層,甚至可以擴展設置父圖層的sublayers屬性。當把圖層的sublayers屬性設置了一個圖層的數組值的時候,你必須保證數組里面每個圖層的父圖層已經被設置為nil。
3.默認情況下從一個可視化圖層樹里面插入和刪除圖層將會觸發動畫。當把一個圖層添加為子圖層的時候,將會觸發父圖層返回標識符為kCAOnOrderIn動畫。當從圖層的子圖層里面刪除一個圖層的時候,將會觸發父圖層返回一個標識符為kCAOnOrderOut的動畫。當替換圖層的子圖層里面的一個圖層的時候,將會觸發父圖層返回一個標識符為KCATransition的動畫。當你操作圖層樹的時候,你可以禁用動畫或者改變使用任何標識符的動畫。 ? 四、圖層的位置調整和大小改變-概述
1.圖層創建以后,你可以通過改變圖層的幾何屬性:frame、bounds、position、anchorPoint和zPosition來編程式移動和改變圖層大小。
2.如果一個圖層的屬性needsDisplayOnBoundsChange被設置為YES的時候,當圖層的bounds屬性改變的時候,圖層的內容將會被重新緩存起來。默認情況下圖層的needsDisplayOnBoundsChange屬性值為NO。
3.默認情況下,設置圖層的屬性frame、bounds、position、anchorPoint和zPosition屬性將會導致圖層動畫顯示新值。 ? 五、圖層的位置調整和大小改變-自動調整圖層大小
1.CALayer提供了一個機制,在父圖層被移動或者改變大小的時候,子圖層可以自動的跟著移動和調整大小。在很多情況下簡單的配置一個圖層的自動調整掩碼(autoresizing ?mask)可以適當的適應程序的行為。
2.一個圖層的自動調整掩碼可以通過指定CAAutoresizingMask的常量結合或運算(OR)所得的結果賦值給圖層的autoresizingMask屬性值。下面列舉了掩碼常量和這些掩碼如何影響圖層的大小調整行為。 (1)kCALayerHeightSizable ? 如果設置了,則layer的高度按比例隨父layer的高度變化。 (2)kCALayerWidthSizable? ? 如果設置了,則layer的寬度按比例隨父layer的寬度變化。 (3)kCALayerMinXMargin ? 如果設置了,則layer的左邊距按比例隨父layer的寬度變化。如果未設置,則layer的左邊距保持原來相對父layer的位置。 (4)kCALayerMaxXMargin? ? 如果設置了,則layer的右邊距按比例隨父layer的寬度變化。如果未設置,則layer的右邊距保持原來相對父layer的位置。 (5)kCALayerMaxYMargin ? 如果設置了,則layer的上邊距按比例隨父layer的寬度變化。如果未設置,則layer的上邊距保持原來相對父layer的位置。 (6)kCALayerMinYMargin ? 如果設置了,則layer的下邊距按比例隨父layer的寬度變化。如果未設置,則layer的下邊距保持原來相對父layer的位置。 ? 3.例如,為了把保持圖層位于它父圖層的相對左下角位置,你可以使用kCALayerMaxXMargin |kCALayerMaxYMargin。 ? 當沿著一個軸具有多個方向被設置為適應可變的時候,那么調整大小的尺寸為使其均勻分布的值。下圖提供了一個常量值的位置的圖形表示。 ? ? ? 4.當這些常量里面的任何一個被省略的時候,圖層的布局在這個方向上值是固定的。當一個常量包含在圖層的自動調整掩碼里面的時候,該方向上的圖層的布局值是適應可變的。
5.CALayer的子類可以重寫函數resizeSublayersWithOldSize:和resizeWithOldSuperlayerSize:來定制化的自動調整圖層大小的行為。圖層的函數resizeSublayersWithOldSize:將會在bounds屬性被修改的時候自動的觸發執行,同時發送一個消息resizeWithOldSuperlayerSize:給圖層的每個子圖層。圖層的每個子圖層根據自動調整掩碼的屬性來比較就的邊界值和新的邊界值來調整它的位置和大小。 ? 六、圖層的位置調整和大小改變-裁剪子圖層 ? ?在Cocoa的視圖里面,當子視圖超出父視圖的邊界的時候,視圖將會被裁剪以適應父視圖的大小。圖層去掉了這個限制,允許子層全部顯示,無論自己相對于父層位置如何。圖層的masksToBounds屬性決定了是否子圖層是否相對父圖層裁剪。該屬性masksToBounds的默認值為NO,即防止子圖層被相對于父圖層裁剪。下圖顯示了當設置圖層的masksToBounds屬性導致的結果,和它如何影響layerB和layerC的顯示。? ??
轉自夢維:http://www.dreamingwish.com/dream-2012/coreanimation-programming-guide-iv-the-layer-tree-structure.html
1.圖層樹是核心動畫里面類似Cocoa視圖的層次結構。比如一個NSView或者UIView的實例擁有父視圖(superview)和子視圖(subview),一個核心動畫的圖層擁有父圖層(suplayer)和子圖層(sublayer)。圖層樹和視圖結構一樣提供了很多便利: (1)復雜的接口可以由簡單的圖層來組合,避免了碩大和復雜的繼承化子類。圖層非常合適于這種堆疊方式來合成復雜的功能。 (2)每個圖層定義了一個基于其父圖層的坐標系的坐標系。當一個圖層變換的時候,它的子圖層同樣變換。 (3)一個動態的圖層樹,可以在程序運行的時候重新設置。圖層可以創建并添加為一個圖層的第一個子圖層,然后從其他圖層的圖層樹上面刪除。 ? 二、在視圖里面顯示圖層
1.核心動畫不提供在一個窗口(window)實際顯示圖層的手段,它們必須通過視圖來托管。當視圖和圖層一起的時候,視圖為圖層提供了底層的事件處理,而圖層為視圖提供了顯示的內容。
2.iOS上面的視圖系統直接建立在核心動畫的圖層上面。每個UIView的實例會自動的創建一個CALayer類的實例,然后把該實例賦值給視圖的layer屬性。你可以在需要的時候向視圖的圖層里面添加子圖層。
3.在Mac OS X,您必須配置一個NSView的實例,通過這樣一種方式才可以讓它托管圖層。為了顯示圖層樹的根圖層,你可以設置一個視圖的圖層和配置視圖以便使用圖層: ? 代碼:向view中插入layer ? //theView is an existing view in a window ? //theRootLayer is the root layer of a layer tree ? [theView setLayer: theRootLayer]; ? [theView setWantsLayer:YES]; ?? 三、從圖層結構里面添加和刪除圖層
1.簡單的實例化一個圖層并不意味已經把它插入了一個圖層樹。而是通過以下的方法來實現從圖層樹里面添加、插入、替換和刪除圖層。 (1)addSublayer: ? Appends the layer to the receiver’s sublayers array. (2)insertSublayer:atIndex: ? Inserts the layer as a sublayer of the receiver at the specified index. (3)insertSublayer:below: ? Inserts the layer into the receiver’s sublayers array, below the specified sublayer. (4)insertSublayer:above: ? Inserts the layer into the receiver’s sublayers array, above the specified sublayer. (5)removeFromSuperlayer ? Removes the receiver from the sublayers array or mask property of the receiver’s superlayer. (6)replaceSublayer:with: ? Replaces the layer in the receiver’s sublayers array with the specified new layer. ? 2.你也可以通過使用一個圖層的數組來設置圖層的子圖層,甚至可以擴展設置父圖層的sublayers屬性。當把圖層的sublayers屬性設置了一個圖層的數組值的時候,你必須保證數組里面每個圖層的父圖層已經被設置為nil。
3.默認情況下從一個可視化圖層樹里面插入和刪除圖層將會觸發動畫。當把一個圖層添加為子圖層的時候,將會觸發父圖層返回標識符為kCAOnOrderIn動畫。當從圖層的子圖層里面刪除一個圖層的時候,將會觸發父圖層返回一個標識符為kCAOnOrderOut的動畫。當替換圖層的子圖層里面的一個圖層的時候,將會觸發父圖層返回一個標識符為KCATransition的動畫。當你操作圖層樹的時候,你可以禁用動畫或者改變使用任何標識符的動畫。 ? 四、圖層的位置調整和大小改變-概述
1.圖層創建以后,你可以通過改變圖層的幾何屬性:frame、bounds、position、anchorPoint和zPosition來編程式移動和改變圖層大小。
2.如果一個圖層的屬性needsDisplayOnBoundsChange被設置為YES的時候,當圖層的bounds屬性改變的時候,圖層的內容將會被重新緩存起來。默認情況下圖層的needsDisplayOnBoundsChange屬性值為NO。
3.默認情況下,設置圖層的屬性frame、bounds、position、anchorPoint和zPosition屬性將會導致圖層動畫顯示新值。 ? 五、圖層的位置調整和大小改變-自動調整圖層大小
1.CALayer提供了一個機制,在父圖層被移動或者改變大小的時候,子圖層可以自動的跟著移動和調整大小。在很多情況下簡單的配置一個圖層的自動調整掩碼(autoresizing ?mask)可以適當的適應程序的行為。
2.一個圖層的自動調整掩碼可以通過指定CAAutoresizingMask的常量結合或運算(OR)所得的結果賦值給圖層的autoresizingMask屬性值。下面列舉了掩碼常量和這些掩碼如何影響圖層的大小調整行為。 (1)kCALayerHeightSizable ? 如果設置了,則layer的高度按比例隨父layer的高度變化。 (2)kCALayerWidthSizable? ? 如果設置了,則layer的寬度按比例隨父layer的寬度變化。 (3)kCALayerMinXMargin ? 如果設置了,則layer的左邊距按比例隨父layer的寬度變化。如果未設置,則layer的左邊距保持原來相對父layer的位置。 (4)kCALayerMaxXMargin? ? 如果設置了,則layer的右邊距按比例隨父layer的寬度變化。如果未設置,則layer的右邊距保持原來相對父layer的位置。 (5)kCALayerMaxYMargin ? 如果設置了,則layer的上邊距按比例隨父layer的寬度變化。如果未設置,則layer的上邊距保持原來相對父layer的位置。 (6)kCALayerMinYMargin ? 如果設置了,則layer的下邊距按比例隨父layer的寬度變化。如果未設置,則layer的下邊距保持原來相對父layer的位置。 ? 3.例如,為了把保持圖層位于它父圖層的相對左下角位置,你可以使用kCALayerMaxXMargin |kCALayerMaxYMargin。 ? 當沿著一個軸具有多個方向被設置為適應可變的時候,那么調整大小的尺寸為使其均勻分布的值。下圖提供了一個常量值的位置的圖形表示。 ? ? ? 4.當這些常量里面的任何一個被省略的時候,圖層的布局在這個方向上值是固定的。當一個常量包含在圖層的自動調整掩碼里面的時候,該方向上的圖層的布局值是適應可變的。
5.CALayer的子類可以重寫函數resizeSublayersWithOldSize:和resizeWithOldSuperlayerSize:來定制化的自動調整圖層大小的行為。圖層的函數resizeSublayersWithOldSize:將會在bounds屬性被修改的時候自動的觸發執行,同時發送一個消息resizeWithOldSuperlayerSize:給圖層的每個子圖層。圖層的每個子圖層根據自動調整掩碼的屬性來比較就的邊界值和新的邊界值來調整它的位置和大小。 ? 六、圖層的位置調整和大小改變-裁剪子圖層 ? ?在Cocoa的視圖里面,當子視圖超出父視圖的邊界的時候,視圖將會被裁剪以適應父視圖的大小。圖層去掉了這個限制,允許子層全部顯示,無論自己相對于父層位置如何。圖層的masksToBounds屬性決定了是否子圖層是否相對父圖層裁剪。該屬性masksToBounds的默認值為NO,即防止子圖層被相對于父圖層裁剪。下圖顯示了當設置圖層的masksToBounds屬性導致的結果,和它如何影響layerB和layerC的顯示。? ??
轉自夢維:http://www.dreamingwish.com/dream-2012/coreanimation-programming-guide-iv-the-layer-tree-structure.html
總結
以上是生活随笔為你收集整理的CoreAnimation编程指南(四)图层树结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java web 开发技术大全 代码_J
- 下一篇: NSZombieEnabled使用