CoreAnimation编程指南(九)图层布局
生活随笔
收集整理的這篇文章主要介紹了
CoreAnimation编程指南(九)图层布局
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
NSView提供了經典的“stuts and springs”模式,用于視圖調整大小的時候把關聯到它父圖層的視圖重新調整位置。圖層支持該模式,而且Mac OS X上面的核心動畫提供了一個更通用的布局管理器機制,允許開發者自己寫他們自己的布局管理器。可以為圖層定制一個布局管理器(它通常實現CALayoutManager協議),負責給圖層的子圖層提供布局功能。
? 本章介紹了約束布局管理器和如何配置一系列約束條件。
? iOS 注意:iOS的CALayer類僅提供“stuts and springs”模式,不提供定制的布局管理器。然而如果你想人工修改關聯到特別視圖的圖層的位置的話,你可以重載相應視圖的layoutSubviews方法,在這里面實現你定制的布局代碼。你可以查看“iOS視圖編程指南(View Programming Guide for iOS)”來獲取更多關于如何在iOS應用里面基于視圖的布局方法。 ? 1.1 約束布局管理器
? 基于條件的布局允許你根據圖層和它同級圖層或者它的父圖層的相應關系指定圖層的位置和大小。通過CAConstraint類描述的關系被保存在子圖層的constraints數組屬性里面。
? 圖1描述了在指定關系的的時候你可以使用的布局特性。 ? Figure 1 ?布局管理器constraints屬性 ? ? ? ? 當使用約束布局的時候,你首先創建一個CAConstraintLayoutManager的實例,并把它設置為父圖層的布局管理器。然后你通過實例化CAConstraint對象為子圖層創建約束條件,并把這些約束條件通過使用addConstraint:方法添加到子圖層的約束屬性里面。每個CAConstraint實例封裝了一個兩個圖層在同一軸上的幾何關系。
? 同級層引用的名稱,使用圖層的name屬性。特定的名稱superlayer被使用來引用圖層的父圖層。
? 每個軸上面最多只能指定兩個關系。如果你給圖層的左邊和右邊都指定約束關系,那么圖層的寬度就會不同。如果你給圖層的左邊和寬度指定約束關系,則圖層的右邊就會從根據父圖層的frame移動。通常你一般只會指定單個邊的約束條件,圖層在同一個軸上面的大小將會作為第二個約束關系。
? 代碼1里面的示例代碼創建了一個圖層,然后使用位置約束條件添加子圖層。圖2描述了布局的結果。 ? Figure 2 ?基于示例中constraints的布局 ? ? ? ? ? 代碼 1 ?配置 layer的 constraints ? // create and set a constraint layout manager for theLayer ? theLayer.layoutManager=[CAConstraintLayoutManager layoutManager]; ? ? CALayer *layerA = [CALayer layer]; ? layerA.name = @"layerA"; ? ? layerA.bounds = CGRectMake(0.0,0.0,100.0,25.0); ? layerA.borderWidth = 2.0; ? ? [layerA addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"superlayer" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMidY]]; ? ? [layerA addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"superlayer" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMidX]]; ? ? [theLayer addSublayer:layerA]; ? ? CALayer *layerB = [CALayer layer]; ? layerB.name = @"layerB"; ? layerB.borderWidth = 2.0; ? ? [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintWidth ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"layerA" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintWidth]]; ? ? [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"layerA" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMidX]]; ? ? ? [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"layerA" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMinY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?offset:-10.0]]; ? ? [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"superlayer" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMinY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?offset:+10.0]]; ? ? [theLayer addSublayer:layerB]; ?? ? 以上是代碼執行過程: ? 創建一個CAConstraintLayoutmanager實例,然后把它設置為theLayer的layoutManger的屬性。 ? ? 創建一個CALayer(layerA)的實例,設置圖層的name屬性為“layerA”。 ? ? 設置layerA的bounds為(0.0,0.0,10.0,25.0)。 ? 創建一個CAConstraint對象,把它作為約束條件添加到layerA里面。該約束條件是把layerA的水平中心對齊它的父圖層的水平中心。 ? 創建第二個CAConstraint對象,把它作為layerA的約束條件。該約束條件是把layerA的垂直中心對齊父圖層的垂直中心。 ? 把layerA添加為theLayer的子圖層。? ? 創建一個CALayer(layerB)的實例,設置圖層的name屬性為“layerB”。 ? 創建一個CAConstraint對象,給layerA添加該約束條件,該約束條件是設置layerB的寬度設置為與layerA的寬度相同。 ? 創建第二個CAConstraint對象,把該約束條件添加到layerB里面。該約束條件是設置layerB的水平中心對齊layerA的水平中心。 ? 創建第三個CAConstraint對象,并把它添加為layerB的約束條件。該約束條件設置layerB的頂邊低于layerA底邊10像素。 ? 創建第四個CAConstraint對象,把它作為約束條件添加到layerB里面。該約束條件是把layerB的底邊高于父圖層底邊10像素。
? 注意: 有可能創建約束條件導致在相同的屬性的循環引用。在布局是無法計算的情況下,行為結果是不可預知的。
轉自夢維:http://www.dreamingwish.com/dream-2012/coreanimation-programming-guide-ix-layer-layout.html
? 本章介紹了約束布局管理器和如何配置一系列約束條件。
? iOS 注意:iOS的CALayer類僅提供“stuts and springs”模式,不提供定制的布局管理器。然而如果你想人工修改關聯到特別視圖的圖層的位置的話,你可以重載相應視圖的layoutSubviews方法,在這里面實現你定制的布局代碼。你可以查看“iOS視圖編程指南(View Programming Guide for iOS)”來獲取更多關于如何在iOS應用里面基于視圖的布局方法。 ? 1.1 約束布局管理器
? 基于條件的布局允許你根據圖層和它同級圖層或者它的父圖層的相應關系指定圖層的位置和大小。通過CAConstraint類描述的關系被保存在子圖層的constraints數組屬性里面。
? 圖1描述了在指定關系的的時候你可以使用的布局特性。 ? Figure 1 ?布局管理器constraints屬性 ? ? ? ? 當使用約束布局的時候,你首先創建一個CAConstraintLayoutManager的實例,并把它設置為父圖層的布局管理器。然后你通過實例化CAConstraint對象為子圖層創建約束條件,并把這些約束條件通過使用addConstraint:方法添加到子圖層的約束屬性里面。每個CAConstraint實例封裝了一個兩個圖層在同一軸上的幾何關系。
? 同級層引用的名稱,使用圖層的name屬性。特定的名稱superlayer被使用來引用圖層的父圖層。
? 每個軸上面最多只能指定兩個關系。如果你給圖層的左邊和右邊都指定約束關系,那么圖層的寬度就會不同。如果你給圖層的左邊和寬度指定約束關系,則圖層的右邊就會從根據父圖層的frame移動。通常你一般只會指定單個邊的約束條件,圖層在同一個軸上面的大小將會作為第二個約束關系。
? 代碼1里面的示例代碼創建了一個圖層,然后使用位置約束條件添加子圖層。圖2描述了布局的結果。 ? Figure 2 ?基于示例中constraints的布局 ? ? ? ? ? 代碼 1 ?配置 layer的 constraints ? // create and set a constraint layout manager for theLayer ? theLayer.layoutManager=[CAConstraintLayoutManager layoutManager]; ? ? CALayer *layerA = [CALayer layer]; ? layerA.name = @"layerA"; ? ? layerA.bounds = CGRectMake(0.0,0.0,100.0,25.0); ? layerA.borderWidth = 2.0; ? ? [layerA addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"superlayer" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMidY]]; ? ? [layerA addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"superlayer" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMidX]]; ? ? [theLayer addSublayer:layerA]; ? ? CALayer *layerB = [CALayer layer]; ? layerB.name = @"layerB"; ? layerB.borderWidth = 2.0; ? ? [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintWidth ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"layerA" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintWidth]]; ? ? [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"layerA" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMidX]]; ? ? ? [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"layerA" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMinY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?offset:-10.0]]; ? ? [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relativeTo:@"superlayer" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attribute:kCAConstraintMinY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?offset:+10.0]]; ? ? [theLayer addSublayer:layerB]; ?? ? 以上是代碼執行過程: ? 創建一個CAConstraintLayoutmanager實例,然后把它設置為theLayer的layoutManger的屬性。 ? ? 創建一個CALayer(layerA)的實例,設置圖層的name屬性為“layerA”。 ? ? 設置layerA的bounds為(0.0,0.0,10.0,25.0)。 ? 創建一個CAConstraint對象,把它作為約束條件添加到layerA里面。該約束條件是把layerA的水平中心對齊它的父圖層的水平中心。 ? 創建第二個CAConstraint對象,把它作為layerA的約束條件。該約束條件是把layerA的垂直中心對齊父圖層的垂直中心。 ? 把layerA添加為theLayer的子圖層。? ? 創建一個CALayer(layerB)的實例,設置圖層的name屬性為“layerB”。 ? 創建一個CAConstraint對象,給layerA添加該約束條件,該約束條件是設置layerB的寬度設置為與layerA的寬度相同。 ? 創建第二個CAConstraint對象,把該約束條件添加到layerB里面。該約束條件是設置layerB的水平中心對齊layerA的水平中心。 ? 創建第三個CAConstraint對象,并把它添加為layerB的約束條件。該約束條件設置layerB的頂邊低于layerA底邊10像素。 ? 創建第四個CAConstraint對象,把它作為約束條件添加到layerB里面。該約束條件是把layerB的底邊高于父圖層底邊10像素。
? 注意: 有可能創建約束條件導致在相同的屬性的循環引用。在布局是無法計算的情況下,行為結果是不可預知的。
轉自夢維:http://www.dreamingwish.com/dream-2012/coreanimation-programming-guide-ix-layer-layout.html
總結
以上是生活随笔為你收集整理的CoreAnimation编程指南(九)图层布局的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 硬负载_软负载均衡和硬负载均
- 下一篇: [前台]---关于input标签的val