CALayer总结

每个uiview都有一个层,每个层可以有多个子层。

1)layer的设计目的不是取代视图,不能基于layer创建一个可视化的控件

2)layer设计目的是提供视图的基本可视内容。提高动画的执行效率。主要是提高动画的执行效率。

3)除了提供可视内容。layer不负责事件响应,内容填充,layer不参与到响应者链条中。

 

 

改变视图的layer的属性,会包含一些隐式动画。

常用的属性有,圆角半径,阴影,边框

它是动画的核心。

核心动画的本质是,将CALayer中的内容转换成位图,然后由图形硬件来操作。

每个uiview内部都有个layer.layer的视图功能非常强大。

CALayer并不是属于uikit框架,在QuartzCore.FrameWork框架了。需要引用这个框架。

使用uiview的layer属性

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    UIView *myview = [[UIView alloc] initWithFrame:CGRectMake(60, 130, 200, 200)];
    [myview setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:myview];
    
    // 设置圆角半径
    myview.layer.cornerRadius = 15.0f;
    // 设置阴影 因为核心动画是夸平台的,不能用UI的方法,因为UIKit框架只能用于ios
    [myview.layer setShadowColor:[UIColor blueColor].CGColor];
    [myview.layer setShadowOffset:CGSizeMake(5, 5)];
    [myview.layer setShadowOpacity:0.5f];
    // 设置边框
    [myview.layer setBorderColor:[UIColor greenColor].CGColor];
    [myview.layer setBorderWidth:2.0f];
    
}






 UIImageView的layer操作

- (void)testimageview
{
    UIImageView *imageview = [[UIImageView alloc] initWithFrame:CGRectMake(60, 130, 200, 200)];
    [imageview setImage:[UIImage imageNamed:@"头像1.png"]];
    [self.view addSubview:imageview];
    // 因为imageview有多个图层,需要设置图层绑定到bounds,没有这句话,功能不起作用
    // 让所有子图层跟随imageview
    // 设置这个属性以后,阴影效果失效
    [imageview.layer setMasksToBounds:YES];
    // 圆角半径
    imageview.layer.cornerRadius = 20.0f;
    // 设置阴影
    [imageview.layer setShadowColor:[UIColor redColor].CGColor];
    [imageview.layer setShadowOffset:CGSizeMake(5, 5)];
    [imageview.layer setShadowOpacity:0.5f];
    // 设置边框
    [imageview.layer setBorderColor:[UIColor redColor].CGColor];
    [imageview.layer setBorderWidth:3];
    
}


如果把下边这个行注释掉。
//[imageview.layer setMasksToBounds:YES];

圆角半径就是去作用。

 

设置imageview.layer的形变参数

// 设置imageview的形变参数,这里设置了3个形变操作,只有最后一个起作用。因为只能设置一个
    [imageview.layer setTransform:CATransform3DMakeTranslation(0, 100, 0)];
[imageview.layer setTransform:CATransform3DMakeScale(
0.5, 2.0, 1)];
[imageview.layer setTransform:CATransform3DMakeRotation(M_PI_4,
0, 0, 1)];




如果旋转的时候只指定x参数,y,z都设置是0,如果设置转45度,变成的样子


如果旋转90度,就看不见,如果旋转180度,就回翻转。通常在旋转的时候,大部分是按照z轴旋转。


 

 给imageview的layer设置keypath形变

 

  
    // 设置imageview的形变参数,这里设置了3个形变操作,只有最后一个起作用。因为只能设置一个
//    [imageview.layer setTransform:CATransform3DMakeTranslation(0, 100, 0)];
//    [imageview.layer setTransform:CATransform3DMakeScale(0.5, 2.0, 1)];
//    [imageview.layer setTransform:CATransform3DMakeRotation(M_PI_4, 1, 0, 0)];
    
    
    // 用keypath来设置形变,这里用的是forKeyPath,不是forKey
    // 平移
    [imageview.layer setValue:@-100 forKeyPath:@"transform.translation.y"];
    [imageview.layer setValue:@2 forKeyPath:@"transform.scale"];
    [imageview.layer setValue:@M_PI_2 forKeyPath:@"transform.rotation.z"];
用3种形变得到的效果
效果1

效果2

效果3


3种形变同时加上


说明在用settransform方法的时候只能设置一种形变。
但是在用KVC模式设置keypath方式下,可以设置多种形变同时起作用。


如何找到这些形变参数

 

 设置uiview的layer形变,尽量用keypath方式。这种方式比较灵活。

 

 

 

 

 

 

 

 

 

posted on 2013-10-01 12:32  老猫zl  阅读(358)  评论(0编辑  收藏  举报