iOS

CALayer

2019-07-26  本文已影响0人  习惯了_就好

当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示,这里的图层就是CALayer。

CALayer的常用属性:

边框颜色(CGColorRef类型)
@property CGColorRef borderColor;

边框宽度
@property CGFloat borderWidth;

圆角半径
@property CGColorRef borderColor;

内容(比如设置为图片CGImageRef)
@property(retain) id contents;

宽度和高度
@property CGRect bounds;

位置(默认指中点,具体由anchorPoint决定)
@property CGPoint position;

锚点(x,y的范围都是0-1),决定了position的含义
@property CGPoint anchorPoint;

背景颜色(CGColorRef类型)
@property CGColorRef backgroundColor;

形变属性
@property CATransform3D transform;
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self testView];
//    [self testImageView];
    [self testImageView2];
}

-(void)testImageView2
{
//    self.myImageView.transform = CGAffineTransformMakeRotation(M_PI_4);
    
//    self.myImageView.layer.transform = CATransform3DMakeScale(2, 1, 0);
    
//    CATransform3DMakeRotation(M_PI_4, 0, 0, 1)以Z轴为旋转中心
//    self.myImageView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);
    
//    self.myImageView.layer.transform = CATransform3DMakeTranslation(10, 20, 0);
    
//    CATransform3DMakeRotation(M_PI_4, 1, 1, 0)以X,Y轴所在平面的中心线为旋转中心
    [self.myImageView.layer setValue:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 1, 1, 0)] forKey:@"transform"];
}

-(void)testImageView
{
    //边框颜色
    self.myImageView.layer.borderColor = [UIColor blackColor].CGColor;
    //边框宽度
    self.myImageView.layer.borderWidth = 2;
    //圆角
    self.myImageView.layer.cornerRadius = 20;
    
    //阴影颜色
    self.myImageView.layer.shadowColor = [UIColor blackColor].CGColor;
    //阴影偏移量
    self.myImageView.layer.shadowOffset = CGSizeMake(10, 5);
    //阴影透明度
    self.myImageView.layer.shadowOpacity = 0.5;
    
    //超出部分是否裁剪掉
    //图片是在自层上绘制的,不设置layer层超出裁剪,图片圆角设置无效,设置了阴影无效
    self.myImageView.layer.masksToBounds = NO;
    
}

-(void)testView
{
    //边框颜色
    self.myView.layer.borderColor = [UIColor blackColor].CGColor;
    //边框宽度
    self.myView.layer.borderWidth = 2;
    //圆角
    self.myView.layer.cornerRadius = 10;
    
    //阴影颜色
    self.myView.layer.shadowColor = [UIColor blackColor].CGColor;
    //阴影偏移量
    self.myView.layer.shadowOffset = CGSizeMake(10, 5);
    //阴影透明度
    self.myView.layer.shadowOpacity = 0.5;
    
    //超出部分是否裁剪掉
    self.myView.layer.masksToBounds = NO;
}

@end

隐式动画:

当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果,而这些属性称为Animatable Properties(可动画属性)

-(void)testLayer
{
    self.layer = [CALayer layer];
    self.layer.bounds = CGRectMake(0, 0, 100, 100);
    self.layer.position = CGPointZero;
    self.layer.backgroundColor = [UIColor blueColor].CGColor;
    self.layer.anchorPoint = CGPointZero;
    
    [self.view.layer addSublayer:self.layer];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//可以通过动画事务(CATransaction)关闭默认的隐式动画效果
    [CATransaction begin];//开启事务
    [CATransaction setDisableActions:YES];//关闭事件
    self.layer.position = CGPointMake(100, 300);
    [CATransaction commit];//提交事务
}
上一篇 下一篇

猜你喜欢

热点阅读