一、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)
二、了解一下CALayer的基本常用的属性:
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectMake(100, 50, 175, 175);
[button setBackgroundImage:[UIImage imageNamed:@"06.jpg"] forState:UIControlStateNormal];
[self.view addSubview:button];
button.layer.cornerRadius = 20 ;
button.layer.borderColor = [[UIColor yellowColor]CGColor];
button.layer.borderWidth = 2 ;
// button.clipsToBounds = YES ;
//阴影颜色
button.layer.shadowColor = [[UIColor blackColor]CGColor];
//阴影的偏移距离
button.layer.shadowOffset = CGSizeMake(20, 20);
//阴影的透明度
button.layer.shadowOpacity = 0.8 ;
//阴影
button.layer.shadowRadius = 20 ;
//是否裁剪边框之外的
// button.layer.masksToBounds = YES ;
//CALayer负责视图的渲染 UI中真正负责绘图的部分 没有用户交互,仅仅是展示视图内容,一般用来做动画
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(100, 300, 175, 175);
layer.backgroundColor = [[UIColor yellowColor]CGColor];
layer.contents = (id)[[UIImage imageNamed:@"06.jpg"]CGImage];
[self.view.layer addSublayer:layer];
layer.shadowOffset = CGSizeMake(20, 20);
layer.shadowColor = [[UIColor redColor]CGColor];
layer.shadowOpacity = 0.3 ;
三、接下来我们写个Demo来演示一下
/*
每一个UIView内部都默认关联着一个CALayer,我们可用称这个Layer为Root Layer(根层)
所有的非Root Layer,也就是手动创建的CALayer对象,都存在着隐式动画
什么是隐式动画?
当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果
而这些属性称为Animatable Properties(可动画属性)
列举几个常见的Animatable Properties:
bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画
backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变动画
position:用于设置CALayer的位置。修改这个属性会产生平移动画
*/
@interface ViewController ()
@property (nonatomic,retain) CALayer *layer ;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.layer = [CALayer layer];
self.layer.bounds = CGRectMake(0, 0, 100, 100);
//设置锚点
self.layer.position = CGPointMake(187.5, 200);
//设置锚点在layer上的比例
self.layer.anchorPoint = CGPointMake(0.2, 0.2) ;
self.layer.cornerRadius = 20 ;
self.layer.borderWidth = 2 ;
self.layer.shadowOffset = CGSizeMake(20, 20);
self.layer.shadowOpacity = 0.2 ;
self.layer.doubleSided = YES ;
self.layer.borderColor = [[UIColor redColor]CGColor];
self.layer.backgroundColor = [[UIColor brownColor]CGColor];
[self.view.layer addSublayer:self.layer];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark -- 平移CALayer
- (IBAction)buttonAction1:(UIButton *)sender {
//创建一个基本动画对象
CABasicAnimation *animation = [CABasicAnimation animation];
//动画的类型
//keyPath layer的某个属性
animation.keyPath = @"position";
//动画的持续时间
animation.duration = 2 ;
//toValue 就是一个临时值,通过CALayer做的动画不会改变layer属性本身的值
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 400)];
//如果要保留动画的最终目的,下面两个属性分都需要设置
//保持动画的最新状态
animation.fillMode = kCAFillModeBackwards ;
//设置动画完成后之后不删除
animation.removedOnCompletion = NO ;
animation.delegate = self ;
[self.layer addAnimation:animation forKey:nil];
}
-(void)animationDidStart:(CAAnimation *)anim
{
NSLog(@"%@",NSStringFromCGRect(self.layer.bounds));
}
#pragma mark --实现缩放
- (IBAction)buttonAction2:(UIButton *)sender {
//1.创建一个基本动画
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];
//2.设置动画持续时间
animation.duration = 2 ;
//3.设置动画的最终效果
animation.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
//4.使动画保留最终状态
animation.fillMode = kCAFillModeForwards ;
animation.removedOnCompletion = NO ;
//5.将动画对象付给layer
[self.layer addAnimation:animation forKey:nil];
}
- (IBAction)buttonAction3:(UIButton *)sender {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
animation.duration = 2 ;
animation.fillMode = kCAFillModeForwards ;
animation.removedOnCompletion = NO ;
animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI / 3, 0, 0, 1)];
[self.layer addAnimation:animation forKey:nil];
}
@end