亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發中CAlayer層的屬性以及自定義層的方法

2020-07-26 03:31:48
字體:
來源:轉載
供稿:網友

CAlayer層的屬性
一、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

2015112392134033.png (364×287)

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

2015112392152151.png (345×306)

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

2015112392211363.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)

2015112392327083.png (332×402)

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

2015112392351153.png (332×390)

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

2015112392408414.png (332×400)

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

2015112392423130.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


顯示效果:

2015112392458238.png (318×502)2015112392522528.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

顯示效果:

2015112392544832.png (321×503)

二、隱式動畫

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


2015112392604225.png (348×532)2015112392710341.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,如果有則表示支持。

2015112392818320.png (592×243)

也可以查看官方文檔

2015112392834436.png (574×589)

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

2015112392856072.png (840×410)

自定義layer
一、第一種方式

1.簡單說明

以前想要在view中畫東西,需要自定義view,創建一個類與之關聯,讓這個類繼承自UIView,然后重寫它的DrawRect:方法,然后在該方法中畫圖。

繪制圖形的步驟:
(1)獲取上下文
(2)繪制圖形
(3)渲染圖形
 
如果在layer上畫東西,與上面的過程類似。
代碼示例:
新建一個類,讓該類繼承自CALayer

2015112392917544.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第一次顯示的時候會自動調用。
實現效果:

2015112392941068.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];

 

二、第二種方式

方法描述:設置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


實現效果:

2015112393006300.png (348×532)

注意點:不能再將某個UIView設置為CALayer的delegate,因為UIView對象已經是它內部根層的delegate,再次設置為其他層的delegate就會出問題。

在設置代理的時候,它并不要求我們遵守協議,說明這個方法是nsobject中的,就不需要再額外的顯示遵守協議了。

2015112393021567.png (592×243)

提示:以后如果要設置某個類的代理,但是這個代理沒要求我們遵守什么特定的協議,那么可以認為這個協議方法是NSObject里邊的。
 
三、補充說明
(1)無論采取哪種方法來自定義層,都必須調用CALayer的setNeedsDisplay方法才能正常繪圖。
(2)詳細現實過程:
當UIView需要顯示時,它內部的層會準備好一個CGContextRef(圖形上下文),然后調用delegate(這里就是UIView)的drawLayer:inContext:方法,并且傳入已經準備好的CGContextRef對象。而UIView在drawLayer:inContext:方法中又會調用自己的drawRect:方法。平時在drawRect:中通過UIGraphicsGetCurrentContext()獲取的就是由層傳入的CGContextRef對象,在drawRect:中完成的所有繪圖都會填入層的CGContextRef中,然后被拷貝至屏幕。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久香蕉国产线看观看亚洲| 亚洲无线码在线一区观看| 成人午夜一级二级三级| 日本国产欧美一区二区三区| 国产亚洲精品久久久久动| 日韩成人中文电影| 狠狠色狠狠色综合日日小说| 欧美在线视频导航| 久久久视频免费观看| 久久久久久久久综合| 一夜七次郎国产精品亚洲| 日韩精品免费视频| 亚洲精品午夜精品| 最近2019中文字幕大全第二页| 亚洲人a成www在线影院| 91精品国产综合久久香蕉922| 亚洲精品99久久久久| 久久中文字幕在线视频| 欧美亚洲在线视频| 日韩中文字幕免费视频| 性欧美xxxx视频在线观看| 26uuu国产精品视频| 亚洲国产日韩欧美在线图片| 日韩精品视频在线| 57pao国产成人免费| 久久亚洲精品国产亚洲老地址| 亚洲精品电影网| 午夜剧场成人观在线视频免费观看| 日韩成人中文电影| 久久久久久这里只有精品| 日韩有码在线视频| 成人在线一区二区| 久久久国产精品一区| 国产精品69精品一区二区三区| 国产一区二区三区在线看| 欧美成人合集magnet| 欧美激情亚洲视频| 精品久久香蕉国产线看观看亚洲| 九九九久久国产免费| 久久久久五月天| 日日摸夜夜添一区| 日韩国产激情在线| 国产精品狼人色视频一区| 51午夜精品视频| 在线观看视频亚洲| 亚洲精品视频中文字幕| 欧美在线中文字幕| 中文字幕欧美日韩va免费视频| 国产a∨精品一区二区三区不卡| 色一情一乱一区二区| 91亚洲精品视频| 国产精品一区二区三区成人| 欧美精品亚州精品| 日韩美女av在线| 欧美日韩国产综合新一区| 久精品免费视频| 亚洲视频axxx| wwwwwwww亚洲| 欧美黑人又粗大| 色综合久久久888| 亚洲国产成人久久综合一区| 亚洲bt欧美bt日本bt| 欧美亚洲一区在线| 欧美另类99xxxxx| 日韩免费在线播放| 精品中文字幕在线观看| 亚洲精品网站在线播放gif| 日韩亚洲欧美中文高清在线| 亚洲欧洲在线免费| 国产成人综合亚洲| 国产精品丝袜一区二区三区| 久久久国产一区二区| 粉嫩av一区二区三区免费野| 青草热久免费精品视频| 国产精品吴梦梦| 69影院欧美专区视频| 美日韩在线视频| 岛国av一区二区在线在线观看| 国产亚洲欧洲黄色| 91精品国产综合久久久久久蜜臀| 日韩av一卡二卡| 九九久久国产精品| 亚洲精品福利视频| 成人国产亚洲精品a区天堂华泰| 国产成人福利网站| 欧美有码在线观看| 欧美性猛交xxxx偷拍洗澡| 成人精品网站在线观看| 国产精品嫩草视频| 久久久久日韩精品久久久男男| 精品一区二区三区四区在线| 91精品久久久久久久久久另类| 亚洲精品永久免费精品| 成人妇女淫片aaaa视频| 国产精品成久久久久三级| 国产精品视频免费在线| 国产精品美女视频网站| 欧美激情二区三区| 久久香蕉精品香蕉| 日韩av免费看| 国产成人精品电影| 国产亚洲欧美视频| 久久免费视频在线| 亚洲精品美女久久久| 亚洲xxx视频| 亚洲精品丝袜日韩| 久久天天躁狠狠躁夜夜av| 精品久久久久久久久久| 国产精品igao视频| 中文国产成人精品久久一| 欧美午夜精品久久久久久浪潮| 国产精品r级在线| 亚洲一区二区三区四区在线播放| 青青精品视频播放| 亚洲天堂av网| 国产一区二区三区中文| 亚洲男人天堂久| 欧美在线视频播放| 国产日韩中文在线| 国产91精品久久久久| 亚洲综合一区二区不卡| 亚洲网在线观看| 日韩成人中文字幕| 国产精品专区h在线观看| 国产精品福利网站| 亚洲午夜av久久乱码| 日本三级久久久| 亚洲精品美女在线| 亚洲bt天天射| 欧美精品激情视频| 91国产中文字幕| 亚洲一区二区自拍| 欧洲亚洲妇女av| 中文字幕日韩高清| 久久久久久久一| 欧美性生交大片免费| 国产精品视频久久久久| 色系列之999| 欧美激情精品久久久久久黑人| 黑人极品videos精品欧美裸| 日产日韩在线亚洲欧美| 懂色av影视一区二区三区| 在线视频欧美日韩精品| 国内精品久久久久久久| 亚洲第一福利在线观看| 国产福利精品视频| 久久久国产成人精品| 国产成人啪精品视频免费网| 中文字幕精品一区二区精品| 欧美激情xxxx| 亚洲字幕在线观看| 高清欧美一区二区三区| 亚洲性夜色噜噜噜7777| 一区二区三区四区精品| 亚洲石原莉奈一区二区在线观看| 欧美黑人xxxⅹ高潮交| 亚洲国产欧美久久| 日韩免费观看在线观看| 久久中文久久字幕| 亚洲欧美制服综合另类| 欧美美最猛性xxxxxx| 亚洲亚裔videos黑人hd| 97人洗澡人人免费公开视频碰碰碰| 欧美成人午夜激情在线|