你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開辟中CAlayer層的屬性和自界說層的辦法

iOS開辟中CAlayer層的屬性和自界說層的辦法

編輯:IOS開發綜合

CAlayer層的屬性
1、position和anchorPoint

1.簡略引見

CALayer有2個異常主要的屬性:position和anchorPoint

@property CGPoint position;

用來設置CALayer在父層中的地位

以父層的左上角為原點(0, 0)

@property CGPoint anchorPoint;

稱為“定位點”、“錨點”

決議著CALayer身上的哪一個點會在position屬性所指的地位

以本身的左上角為原點(0, 0)

它的x、y取值規模都是0~1,默許值為(0.5, 0.5)

2.圖示

anchorPoint

它的取值為0~1

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445690.png (364×287)

白色圖層的anchorPoint為(0,0)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445610.png (345×306)

白色圖層的anchorPoint為(0.5,0.5)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445653.png (350×283)

白色圖層的anchorPoint為(1,1)

2015112392232871.png (343×283)

白色圖層的anchorPoint為(0.5,0)

2015112392247207.png (334×289)

position和anchorPoint

添加一個白色圖層到綠色圖層上,白色圖層顯示到甚麼地位,由position屬性決議

假定白色圖層的position是(100,100)

  究竟把白色圖層的哪一個點挪動到(100,100)的坐標地位,錨點。

  白色圖層的錨點是(0,0)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445675.png (332×402)

白色圖層的錨點是(0.5,0.5)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445661.png (332×390)

白色圖層的錨點是(1,1)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445629.png (332×400)

白色圖層的錨點是(0.5,0)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445659.png (332×397)

3.代碼示例

(1)沒有設置錨點。默許的錨點地位為(0.5,0.5)

//
//  YYViewController.m
//  03-錨點等屬性
//
//  Created by apple on 14-6-21.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()

@end


@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //創立圖層
    CALayer *layer=[CALayer layer];
    //設置圖層的屬性
    layer.backgroundColor=[UIColor redColor].CGColor;
    layer.bounds=CGRectMake(0, 0, 100, 100);
    //添加圖層
    [self.view.layer addSublayer:layer];
   
}

@end

顯示後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445788.png (318×502)https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445753.png (348×532)

(1)設置錨點地位為(0,0)

- (void)viewDidLoad
{
    [super viewDidLoad];
    //創立圖層
    CALayer *layer=[CALayer layer];
    //設置圖層的屬性
    layer.backgroundColor=[UIColor redColor].CGColor;
    layer.bounds=CGRectMake(0, 0, 100, 100);
    //設置錨點為(0,0)
    layer.anchorPoint=CGPointZero;
    //添加圖層
    [self.view.layer addSublayer:layer];
}
@end

顯示後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445750.png (321×503)

2、隱式動畫

1.簡略解釋

每個UIView外部都默許聯系關系著一個CALayer,我們可用稱這個Layer為Root Layer(根層)

一切的非Root Layer,也就是手動創立的CALayer對象,都存在著隱式動畫

甚麼是隱式動畫?

當對非Root Layer的部門屬性停止修正時,默許會主動發生一些動畫後果

而這些屬性稱為Animatable Properties(可動畫屬性)

 

羅列幾個罕見的Animatable Properties:

bounds:用於設置CALayer的寬度和高度。修正這個屬性會發生縮放動畫

backgroundColor:用於設置CALayer的配景色。修正這個屬性會發生配景色的突變動畫

position:用於設置CALayer的地位。修正這個屬性會發生平挪動畫

2.代碼示例

//
//  YYViewController.m
//  04-隱式動畫
//
//  Created by apple on 14-6-21.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()
@property(nonatomic,strong)CALayer *layer;
@end


@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //創立圖層
    CALayer *mylayer=[CALayer layer];
    //設置圖層屬性
    mylayer.backgroundColor=[UIColor brownColor].CGColor;
    mylayer.bounds=CGRectMake(0, 0, 150, 100);
    //顯示地位
    mylayer.position=CGPointMake(100, 100);
    mylayer.anchorPoint=CGPointZero;
    mylayer.cornerRadius=20;
    //添加圖層
    [self.view.layer addSublayer:mylayer];
    self.layer=mylayer;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //隱式動畫
    self.layer.bounds=CGRectMake(0, 0, 200, 60);
    self.layer.backgroundColor=[UIColor yellowColor].CGColor;
}
@end

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445782.png (348×532)https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445830.png (348×532)

封閉隱式動畫:

[CATransaction begin];
[CATransaction setDisableActions:YES];
//隱式動畫
self.layer.bounds=CGRectMake(0, 0, 200, 60);
self.layer.backgroundColor=[UIColor yellowColor].CGColor;
[CATransaction commit];

若何檢查CALayer的某個屬性能否支撐隱式動畫?

  可以檢查頭文件,看有無Animatable,假如有則表現支撐。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445893.png (592×243)

也能夠檢查官方文檔

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445990.png (574×589)

文檔中標明的這些屬性都是支撐隱式動畫的

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445982.png (840×410)

自界說layer
1、第一種方法

1.簡略解釋

之前想要在view中畫器械,須要自界說view,創立一個類與之聯系關系,讓這個類繼續自UIView,然後重寫它的DrawRect:辦法,然後在該辦法中繪圖。

繪制圖形的步調:
(1)獲得高低文
(2)繪制圖形
(3)襯著圖形
 
假如在layer上畫器械,與下面的進程相似。
代碼示例:
新建一個類,讓該類繼續自CALayer

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615445927.png (533×187)

YYMylayer.m文件

//
//  YYMylayer.m
//  05-自界說layer(1)
//
//  Created by apple on 14-6-21.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYMylayer.h"

@implementation YYMylayer
//重寫該辦法,在該辦法內繪制圖形
-(void)draWinContext:(CGContextRef)ctx
{
    //1.繪制圖形
    //畫一個圓
    CGContextAddEllipseInRect(ctx, CGRectMake(50, 50, 100, 100));
    //設置屬性(色彩)
//    [[UIColor yellowColor]set];
    CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);
   
    //2.襯著
    CGContextFillPath(ctx);
}
@end


在掌握器中,創立一個自界說的類
//
//  YYViewController.m
//  05-自界說layer(1)
//
//  Created by apple on 14-6-21.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYMylayer.h"

@interface YYViewController ()

@end


@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //1.創立自界說的layer
    YYMylayer *layer=[YYMylayer layer];
    //2.設置layer的屬性
    layer.backgroundColor=[UIColor brownColor].CGColor;
    layer.bounds=CGRectMake(0, 0, 200, 150);
    layer.anchorPoint=CGPointZero;
    layer.position=CGPointMake(100, 100);
    layer.cornerRadius=20;
    layer.shadowColor=[UIColor blackColor].CGColor;
    layer.shadowOffset=CGSizeMake(10, 20);
    layer.shadowOpacity=0.6;
   
    [layer setNeedsDisplay];
    //3.添加layer
    [self.view.layer addSublayer:layer];
   
}

@end

留意點:
(1)默許為無色,不會顯示。要想讓繪制的圖形顯示出來,還須要設置圖形的色彩。留意不克不及直接應用UI框架中的類
(2)在自界說layer中的-(void)draWinContext:辦法不會本身挪用,只能本身經由過程setNeedDisplay辦法挪用,在view中畫器械DrawRect:辦法在view第一次顯示的時刻會主動挪用。
完成後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615450000.png (348×532)

2.拓展
  UIView中畫圖解釋

#import "YYVIEW.h"

@implementation YYVIEW


- (void)drawRect:(CGRect)rect
{
    //1.獲得高低文
    CGContextRef ctx=UIGraphicsGetCurrentContext();
    //2.繪制圖形
    CGContextAddEllipseInRect(ctx, CGRectMake(50, 50, 100, 100));
    //設置屬性(色彩)
    //    [[UIColor yellowColor]set];
    CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);
   
    //3.襯著
    CGContextFillPath(ctx);
    //在履行襯著操作的時刻,實質上它的外部相當於挪用了上面的辦法
    [self.layer draWinContext:ctx];
}

解釋:在UIView中繪制圖形,獲得的高低文就是這個view對應的layer的高低文。在襯著的時刻,就是把圖形襯著到對應的layer上。

  在履行襯著操作的時刻,實質上它的外部相當於履行了 [self.layer drawInContext:ctx];

 

2、第二種方法

辦法描寫:設置CALayer的delegate,然後讓delegate完成drawLayer:inContext:辦法,當CALayer須要畫圖時,會挪用delegate的drawLayer:inContext:辦法停止畫圖。

代碼示例:

//
//  YYViewController.m
//  06-自界說layer(2)
//
//  Created by apple on 14-6-21.
//  Copyright (c) 2014年 itcase. All rights reserved.

#import "YYViewController.h"
@interface YYViewController ()
@end


@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //1.創立自界說的layer
    CALayer *layer=[CALayer layer];
    //2.設置layer的屬性
    layer.backgroundColor=[UIColor brownColor].CGColor;
    layer.bounds=CGRectMake(0, 0, 200, 150);
    layer.anchorPoint=CGPointZero;
    layer.position=CGPointMake(100, 100);
    layer.cornerRadius=20;
    layer.shadowColor=[UIColor blackColor].CGColor;
    layer.shadowOffset=CGSizeMake(10, 20);
    layer.shadowOpacity=0.6;
   
    //設置署理
    layer.delegate=self;
    [layer setNeedsDisplay];
    //3.添加layer
    [self.view.layer addSublayer:layer];
}

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    //1.繪制圖形
    //畫一個圓
    CGContextAddEllipseInRect(ctx, CGRectMake(50, 50, 100, 100));
    //設置屬性(色彩)
    //    [[UIColor yellowColor]set];
    CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);
   
    //2.襯著
    CGContextFillPath(ctx);
}
@end

完成後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615450049.png (348×532)

留意點:不克不及再將某個UIView設置為CALayer的delegate,由於UIView對象曾經是它外部根層的delegate,再次設置為其他層的delegate就會出成績。

在設置署理的時刻,它其實不請求我們遵照協定,解釋這個辦法是nsobject中的,就不須要再額定的顯示遵照協定了。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615450043.png (592×243)

提醒:今後假如要設置某個類的署理,然則這個署理沒請求我們遵照甚麼特定的協定,那末可以以為這個協定辦法是NSObject裡邊的。
 
3、彌補解釋
(1)不管采用哪一種辦法來自界說層,都必需挪用CALayer的setNeedsDisplay辦法能力正常畫圖。
(2)具體實際進程:
當UIView須要顯示時,它外部的層會預備好一個CGContextRef(圖形高低文),然後挪用delegate(這裡就是UIView)的drawLayer:inContext:辦法,而且傳入曾經預備好的CGContextRef對象。而UIView在drawLayer:inContext:辦法中又會挪用本身的drawRect:辦法。日常平凡在drawRect:中經由過程UIGraphicsGetCurrentContext()獲得的就是由層傳入的CGContextRef對象,在drawRect:中完成的一切畫圖都邑填入層的CGContextRef中,然後被拷貝至屏幕。

【iOS開辟中CAlayer層的屬性和自界說層的辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved