CALayer總結(一)


1.geometryFlipped   設置為yes,則子圖層或者子視圖本來相對於左上角放置 改為 相對於左下角放置;

2.contents

3.contentGravity:

kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize
kCAGravityResizeAspect
kCAGravityResizeAspectFill
4.contentsScale

5.maskToBounds

6.contentsRect

7.contentsCenter

8.自己繪制寄宿圖

方法-:繼承UIView並實現-drawRect:(如果你不需要寄宿圖,那就不要創建這個方法了,這會造成CPU資源和內存的浪費,這也是為什么蘋果建議:如果沒有自定義繪制的任務就不要在子類中寫一個空的-drawRect:方法。)

方法二:CALayer有一個可選的delegate屬性,參考代碼如下:

blueLayer.delegate = self;

[blueLayer display];
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
  //draw a thick red circle
  CGContextSetLineWidth(ctx, 10.0f); 
  CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
  CGContextStrokeEllipseInRect(ctx, layer.bounds);
}
  • 我們在blueLayer上顯式地調用了-display。不同於UIView,當圖層顯示在屏幕上時,CALayer不會自動重繪它的內容。它把重繪的決定權交給了開發者。

  • 盡管我們沒有用masksToBounds屬性,繪制的那個圓仍然沿邊界被裁剪了。這是因為當你使用CALayerDelegate繪制寄宿圖的時候,並沒有對超出邊界外的內容提供繪制支持。

9.布局:

frame並不是一個非常清晰的屬性,它其實是一個虛擬屬性,是根據bounds,position和transform計算而來,所以當其中任何一個值發生改變,frame都會變化。相反,改變frame的值同樣會影響到他們當中的值;

3.2.jpeg

錨點

3.3.jpeg

10.坐標系

- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer; 
- (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer; 
- (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;
11.zPosition
增加圖層的zPosition,就可以把圖層向相機方向前置,於是它就在所有其他圖層的前面了(或者至少是小於它的zPosition值的圖層的前面);同樣適用於視圖的layer
12.Hit Testing
CALayer並不關心任何響應鏈事件,所以不能直接處理觸摸事件或者手勢。但是它有一系列的方法幫你處理事件:-containsPoint:和-hitTest:。
13.自動布局
如果想隨意控制CALayer的布局,就需要手工操作。最簡單的方法就是使用CALayerDelegate如下函數:
- (void)layoutSublayersOfLayer:(CALayer *)layer;
當圖層的bounds發生改變,或者圖層的-setNeedsLayout方法被調用的時候,這個函數將會被執行。這使得你可以手動地重新擺放或者重新調 整子圖層的大小,但是不能像UIView的autoresizingMask和constraints屬性做到自適應屏幕旋轉。
14.conrnerRadius

 默認情況下,這個曲率值只影響背景顏色而不影響背景圖片或是子圖層。不過,如果把masksToBounds設置成YES的話,圖層里面的所有東西都會被截取

15.shadowOpacity

若要改動陰影的表現,你可以使用CALayer的另外三個屬性:shadowColor,shadowOffset和shadowRadius

16.shadowPath屬性

我們已經知道圖層陰影並不總是方的,而是從圖層內容的形狀繼承而來。這看上去不錯,但是實時計算陰影也是一個非常消耗資源的,尤其是圖層有多個子圖層,每個圖層還有一個有透明效果的寄宿圖的時候。

如果你事先知道你的陰影形狀會是什么樣子的,你可以通過指定一個shadowPath來提高性能;

17.圖層蒙板

@interface ViewController ()

@property (nonatomic, weak) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad

{

    [super viewDidLoad];

    //create mask layer

    CALayer *maskLayer = [CALayer layer];

    maskLayer.frame = self.imageView.bounds;

    UIImage *maskImage = [UIImage imageNamed:@"1"];

    maskLayer.contents = (__bridge id)maskImage.CGImage;

    //apply mask to image layer?

    self.imageView.layer.mask = maskLayer;

    self.imageView.image=[UIImage imageNamed:@"2"];

}

@end

CALayer蒙板圖層真正厲害的地方在於蒙板圖不局限於靜態圖。任何有圖層構成的都可以作為mask屬性,這意味着你的蒙板可以通過代碼甚至是動畫實時生成。

18.shouldRasterize

實現組透明的效果,如果它被設置為YES,在應用透明度之前,圖層及其子圖層都會被整合成一個整體的圖片,這樣就沒有透明度混合的問題了;

為了啟用shouldRasterize屬性,我們設置了圖層的rasterizationScale屬性。默認情況下,所有圖層拉伸都是1.0, 所以如果你使用了shouldRasterize屬性,你就要確保你設置了rasterizationScale屬性去匹配屏幕,以防止出現Retina屏幕像素化的問題。

button2.layer.shouldRasterize = YES;
button2.layer.rasterizationScale = [UIScreen mainScreen].scale;

19.變換(CGAffineTransform)

view.transform=CGAffineTransformMakeRotation(M_PI_4) <---->self.view.layer.affineTransform=CGAffineTransformMakeRotation(M_PI_4) ;
CGAffineTransformMakeRotation(CGFloat angle) 
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)
混合變換
CGAffineTransformRotate(CGAffineTransform t, CGFloat angle)     
CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy)      
CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty)
參考代碼:
    CGAffineTransform transform = CGAffineTransformIdentity; //scale by 50%
    transform = CGAffineTransformScale(transform, 0.5, 0.5); //rotate by 30 degrees
    transform = CGAffineTransformRotate(transform, M_PI / 180.0 * 30.0); //translate by 200 points
    transform = CGAffineTransformTranslate(transform, 200, 0);
    //apply transform to layer
    self.layerView.layer.affineTransform = transform;

設置CGAffineTransform的矩陣值,做任意變換:

    CGAffineTransform transform = CGAffineTransformIdentity;
    transform.c = -x;
    transform.b = y;

20.變換(CATransform3D)

對應layer的transform屬性
CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz) 
CATransform3DMakeTranslation(Gloat tx, CGFloat ty, CGFloat tz)

5.7.jpeg

 

transform.m34---->應用透視效果

21.sublayerTransform

CALayer有一個屬性叫做sublayerTransform。它也是CATransform3D類型,但和對一個圖層的變換不同,它影響到所有的子圖層。這意味着你可以一次性對包含這些圖層的容器做變換,於是所有的子圖層都自動繼承了這個變換方法。

22.doubleSided

CALayer有一個叫做doubleSided的屬性來控制圖層的背面是否要被繪制。這是一個BOOL類型,默認為YES,如果設置為NO,那么當圖層正面從相機視角消失的時候,它將不會被繪制。

23.CAShapeLayer 

使用CAShapeLayer有以下一些優點:

  • 渲染快速。CAShapeLayer使用了硬件加速,繪制同一圖形會比用Core Graphics快很多。

  • 高效使用內存。一個CAShapeLayer不需要像普通CALayer一樣創建一個寄宿圖形,所以無論有多大,都不會占用太多的內存。

  • 不會被圖層邊界剪裁掉。一個CAShapeLayer可以在邊界之外繪制。你的圖層路徑不會像在使用Core Graphics的普通CALayer一樣被剪裁掉(如我們在第二章所見)。

  • 不會出現像素化。當你給CAShapeLayer做3D變換時,它不像一個有寄宿圖的普通圖層一樣變得像素化。

24.CATextLayer

CATextLayer比UILabel有着更好的性能表現,同時還有額外的布局選項並且在iOS 5上支持富文本。

讓我們編輯一下示例使用到NSAttributedString(見清單6.3).iOS 6及以上我們可以用新的NSTextAttributeName實例來設置我們的字符串屬性,但是練習的目的是為了演示在iOS 5及以下,所以我們用了Core Text,也就是說你需要把Core Text framework添加到你的項目中。否則,編譯器是無法識別屬性常量的。

UILabel的替代品

每一個UIView都是寄宿在一個CALayer的示例上。這個圖層是由視圖自動創建和管理的,那我們可以用別的圖層類型替代它么?一旦被創建,我們就無法代替這個圖層了。但是如果我們繼承了UIView,那我們就可以重寫+layerClass方法使得在創建的時候能返回一個不同的圖層子類。UIView會在初始化的時候調用+layerClass方法,然后用它的返回類型來創建宿主圖層。

把CATextLayer作為宿主圖層的另一好處就是視圖自動設置了contentsScale屬性。

25.CATransformLayer

在立方體示例,我們將通過旋轉camara來解決圖層平面化問題而不是像立方體示例代碼中用的sublayerTransform。這是一個非常不錯的技巧,但是只能作用域單個對象上,如果你的場景包含兩個立方體,那我們就不能用這個技巧單獨旋轉他們了。 

CATransformLayer不同於普通的CALayer,因為它不能顯示它自己的內容。只有當存在了一個能作用域子圖層的變換它才真正存在。CATransformLayer並不平面化它的子圖層,所以它能夠用於構造一個層級的3D結構

26.CAGradientLayer

CAGradientLayer是用來生成兩種或更多顏色平滑漸變的。用Core Graphics復制一個CAGradientLayer並將內容繪制到一個普通圖層的寄宿圖也是有可能的,但是CAGradientLayer的真正好處在於繪制使用了硬件加速。

27.CAReplicatorLayer

CAReplicatorLayer的目的是為了高效生成許多相似的圖層。它會繪制一個或多個圖層的子圖層,並在每個復制體上應用不同的變換。

instanceCount屬性指定了圖層需要重復多少次。instanceTransform指定了一個CATransform3D 3D變換(這種情況下,下一圖層的位移和旋轉將會移動到圓圈的下一個點)。變換是逐步增加的,每個實例都是相對於前一實例布局。這就是為什么這些復制體最終不會出現在同一位置上;

CAReplicatorLayer真正應用到實際程序上的場景比如:一個游戲中導彈的軌跡雲,或者粒子爆炸。除此之外,還有一個實際應用是:反射。

28.CAScrollLayer

CAScrollLayer有一個-scrollToPoint:方法,它自動適應bounds的原點以便圖層內容出現在滑動的地方。注意,這就是它做的所有事情。前面提到過,Core Animation並不處理用戶輸入,所以CAScrollLayer並不負責將觸摸事件轉換為滑動事件,既不渲染滾動條,也不實現任何iOS指定行為例如滑動反彈(當視圖滑動超多了它的邊界的將會反彈回正確的地方)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM