程序员

iOS开发之CALayer介绍

2016-03-09  本文已影响1424人  李小南

CALayer简介:

UIView中的layer属性

@property(nonatomic,readonly,retain) CALayer *layer; 
     宽度和高度
    @property CGRect bounds;
    
    位置(默认指中心点,具体由anchorPoint决定)
    @property CGPoint position;
    
    锚点(x,y的范围都是0-1),决定了position的含义
    @property CGPoint anchorPoint;
    
    背景颜色(CGColorRef类型)
    @property CGColorRef backgroundColor;
    
    形变属性
    @property CATransform3D transform;
    
    边框颜色(CGColorRef类型)
    @property CGColorRef borderColor;
    
    边框宽度
    @property CGFloat borderWidth;
    
    圆角半径
    @property CGColorRef borderColor;
    
    内容(比如设置为图片CGImageRef)
    @property(retain) id contents;
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIView *yellowView;
    
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //设置边框(边框宽度往里走的)
        self.imageView.layer.borderColor = [UIColor redColor].CGColor;
        self.imageView.layer.borderWidth = 3;
        
        //设置阴影
        self.imageView.layer.shadowColor = [UIColor blueColor].CGColor;
        self.imageView.layer.shadowOpacity = 1;    //阴影的不透明度,默认是0
        self.imageView.layer.shadowOffset = CGSizeMake(-10, 10);
        self.imageView.layer.shadowRadius = 50;    //越大越模糊
        
        //设置圆角半径
        self.imageView.layer.cornerRadius = 50;
        //超过根层以外的内容就会自动裁剪掉.------阴影也会没有,不能共存
        self.imageView.layer.masksToBounds = YES;
        
        NSLog(@"%@",self.imageView.layer.sublayers);
        NSLog(@"%@",self.imageView.layer.contents); //imageView的图片存放在layer的contents里面.所以设置layer的圆角半径不会影响到图片
    }
    
    - (void)UIViewLayer
    {
        //设置边框(边框宽度往里走的)
        self.yellowView.layer.borderColor = [UIColor redColor].CGColor;
        self.yellowView.layer.borderWidth = 3;
        
        //设置阴影
        self.yellowView.layer.shadowColor = [UIColor blueColor].CGColor;
        self.yellowView.layer.shadowOpacity = 1;    //阴影的不透明度,默认是0
        self.yellowView.layer.shadowOffset = CGSizeMake(-10, 10);
        self.yellowView.layer.shadowRadius = 50;    //越大越模糊
        
        //设置圆角半径
        self.yellowView.layer.cornerRadius = 50;
    }

不同点:
注意:UIImageView当中Image并不是直接添加在层上面的.这是添加在layer当中的contents里.
我们设置层的所有属性它只作用在层上面.对contents里面的东西并不起作用.所以我们看不到图片有圆角的效果.
想要让图片有圆角的效果.可以把masksToBounds这个属性设为YES,
当设为YES,把就会把超过根层以外的东西都给裁剪掉.

CALayer的 CATransform3D属性

旋转,x,y,z 分别代表x,y,z轴.(如UIView的动画都是绕着Z轴变化的)
self.imageView.layer.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);
平移
self.imageView.layer.transform = CATransform3DScale(self.imageView.layer.transform, 0.5, 0.5, 0);
缩放
self.imageView.layer.transform = CATransform3DTranslate(self.imageView.layer.transform, 50, 50, 0);

可以通过KVC的方式进行设置属性.

但是CATransform3DMakeRotation它的值,是一个结构体, 所以要把结构转成对象.
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
[_imageView.layer setValue:value forKeyPath:@"transform.scale"];

后面forKeyPath属性值不是乱写的.苹果文档当中给了相关的属性.


Snip20160309_2.png

CALayer的position和anchorPoint

position和anchorPoint是CAlayer的两个属性.
我们以前修改一个控件的位置都是能过Frame的方式进行修改.
现在利用CALayer的position和anchorPoint属性也能够修改控件的位置.

这两个属性是配合使用的.

  1. position:它是用来设置当前的layer在父控件当中的位置的.
    所以它的坐标原点.以父控件的左上角为(0.0)点.
  2. anchorPoint:它是决点CALayer身上哪一个点会在position属性所指的位置
    anchorPoint它是以当前的layer左上角为原点(0.0)
    它的取值范围是0~1,它的默认在中间也就是(0.5,0.5)的位置.
    anchorPoint又称锚点.就是把锚点定到position所指的位置.

两者结合使用.想要修改某个控件的位置,我们可以设置它的position点.
设置完毕后.layer身上的anchorPoint会自动定到position所在的位置

隐式动画

了解什么是隐式动画前,要先了解是什么根层和非根层.
1.根层:UIView内部自动关联着的那个layer我们称它是根层.
2.非根层:自己手动创建的层,称为非根层.

隐式动画就是当对非根层的部分属性(bounds、backgroundColor、position等)进行修改时, 它会自动的产生一些动画的效果.
我们称这个默认产生的动画为隐式动画.

开启事务
[CATransaction begin];
设置事务没有动画
[CATransaction setDisableActions:NO];
设置隐式动画执行的时长
[CATransaction setAnimationDuration:2];
提交事务
[CATransaction commit];
上一篇下一篇

猜你喜欢

热点阅读