6.2 核心动画->1.2 CALayer的创建 &

作者: 蓝田_Loto | 来源:发表于2016-07-25 13:16 被阅读207次

本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。


本文相关目录:
===================== 所属文集:6.0 图形和多媒体 =====================
6.2 核心动画->1.0 CALayer的简介
6.2 核心动画->1.1 CALayer的基本属性
6.2 核心动画->1.2 CALayer的创建 & 非根layer的隐式动画
6.2 核心动画->2.0 Core Animation(核心动画)
6.2 核心动画->3.0 核心动画 & UIView动画
6.2 核心动画->4.0 常用动画效果
===================== 所属文集:6.0 图形和多媒体 =====================


1、CALayer的创建

layer 的创建:
CALayer *layer = [[CALayer alloc] init]; // 创建layer
layer 的添加:
[self.view.layer addSublayer:layer]; // 把创建的layer 添加到 view的layer当中

代码示例:

#define degree2angle(angle) ((angle)*M_PI / 180)
#import "ViewController.h"

@interface ViewController ()
@property(weak, nonatomic) CALayer *layer;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.

  // frame => 用 bounds & position
  UIView *redView =
      [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

  // 背景色
  redView.backgroundColor = [UIColor redColor];

  // 边框
  redView.layer.borderWidth = 10;
  // borderColor 是一个 CGColor类型,通过[UIColor xxxxColor].CGColor 转换
  redView.layer.borderColor = [UIColor whiteColor].CGColor;

  // 阴影
  redView.layer.shadowOffset = CGSizeZero;
  redView.layer.shadowColor = [UIColor blueColor].CGColor;
  redView.layer.shadowOpacity = 1;
  redView.layer.shadowRadius = 50; //半径

  // 圆角
  redView.layer.cornerRadius = 50;
  redView.layer.masksToBounds = YES; //超出layer 的部分剪切

  // 大小
  redView.layer.bounds = CGRectMake(0, 0, 200, 200);

  // 位置 (默认的情况下  positon的点 表示 view中心的位置)
  redView.layer.position = CGPointMake(100, 100);

  // 内容  (将一个UIImage类型转换为CGImageRef)
  redView.layer.contents = (__bridge id)([UIImage imageNamed:@"TD"].CGImage);

  // 颜色
  redView.layer.backgroundColor = [UIColor blueColor].CGColor;

  // 将自定义layer添加到视图(图层是可以嵌套的)
  [self.view addSubview:redView];

  self.layer = redView.layer;
}

#pragma mark - 在CALayer头文件中所有标注Animatable的属性,都是可以动画的
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

  // 获取触摸对象
  UITouch *touch = touches.anyObject;
  // 获取手指的位置
  CGPoint location = [touch locationInView:self.view];
  // position 设置图层的位置
  self.layer.position = location;

  // 修改图层属性
  // 问题:同时指定transform,前面的会被后面的覆盖
  // 用"大招" KVC来解决,可以做到形变参数的叠加
  // 1.缩放
  CGFloat scale = (arc4random_uniform(5) + 1) / 10.0 + 0.5;
  //    self.layer.transform = CATransform3DMakeScale(scale, scale, 0);
  [self.layer setValue:@(scale) forKeyPath:@"transform.scale"];

  // 2. 旋转69
  CGFloat rotate = degree2angle(arc4random_uniform(360));
  //    self.layer.transform = CATransform3DMakeRotation(rotate, 0, 0, 1);
  [self.layer setValue:@(rotate) forKeyPath:@"transform.rotation.y"];

  // 3. 透明度
  CGFloat alpha = (arc4random_uniform(5) + 1) / 10.0 + 0.5;
  //    self.layer.opacity = alpha;
  [self.layer setValue:@(alpha) forKeyPath:@"opacity"];

  // 4. 设置圆角半径
  CGFloat r = arc4random_uniform(self.layer.bounds.size.width * 0.5);
  self.layer.cornerRadius = r;

  // 5. 设置边线
  self.layer.borderColor = [self randomColor].CGColor;
  self.layer.borderWidth = 3.0;
}

- (UIColor *)randomColor {

  CGFloat r = arc4random_uniform(256) / 255.0;
  CGFloat b = arc4random_uniform(256) / 255.0;
  CGFloat g = arc4random_uniform(256) / 255.0;

  return [UIColor colorWithRed:r green:g blue:b alpha:1];
}

@end

运行效果:


CALayer的创建.gif

2、非根layer的隐式动画

Root Layer(根层):

每一个UIView内部都默认关联着一个CALayer,我们可称这个Layer为Root Layer(根层)

  • 所有的非Root Layer,也就是手动创建的CALayer对象,都存在着隐式动画
  • 控件的根layer是没有隐式动画的
  • 隐式动画的默认时长为1/4秒

隐式动画:

当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果,这些动画称为隐式动画


CALayer的"可动画属性"
- 凡是文档中有"Animatable"字样的属性都是可动画属性
- 可动画属性就是说: 只要设置了属性(改变了属性), 会自动使用画的方式来执行。
可动画属性:

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

- bounds:(缩放动画)用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画
- backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变动画
- position:(平移动画)用于设置CALayer的位置。修改这个属性会产生平移动画
- opacity:(改变透明度)淡入淡出动画

layer禁用隐式动画:

可以通过动画事务(CATransaction)关闭默认的隐式动画效果

#pragma mark - 关闭默认的隐式动画效果
  UITouch *t = touches.anyObject;        // 获取触摸对象
  CGPoint p = [t locationInView:t.view]; // 获取手指的位置

  // 事务
  [CATransaction begin];                 // 开启事务
  [CATransaction setDisableActions:YES]; // 禁用隐式动画

  self.layer.position = p; // 更改可动画属性(这里是更改位置)

  [CATransaction commit]; // 提交事务

示例代码:

#define angle2radion(angle) ((angle) / 180.0 * M_PI)

#import "ViewController.h"

@interface ViewController ()
@property(weak, nonatomic) CALayer *layer;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  // 创建一个非根layer
  CALayer *layer = [[CALayer alloc] init];

  // 可动画属性
  layer.bounds = CGRectMake(0, 0, 100, 100);          // 大小
  layer.position = CGPointMake(100, 100);             // 位置
  layer.backgroundColor = [UIColor redColor].CGColor; // 颜色
  layer.opacity = 0.9;                                // 透明度

  // 把layer添加到view的layer上
  [self.view.layer addSublayer:layer];

  // 给全局属性赋值
  //  self.layer = layer;
  _layer = layer;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

#pragma mark - layer随机旋转
  _layer.transform = CATransform3DMakeRotation(
      angle2radion(arc4random_uniform(360) + 1), 0, 0, 1);
  _layer.position =
      CGPointMake(arc4random_uniform(200) + 20, arc4random_uniform(400) + 50);
  _layer.cornerRadius = arc4random_uniform(50);
  _layer.backgroundColor = [self randomColor].CGColor;
  _layer.borderWidth = arc4random_uniform(10);
  _layer.borderColor = [self randomColor].CGColor;

#pragma mark - 关闭默认的隐式动画效果
  UITouch *t = touches.anyObject;        // 获取触摸对象
  CGPoint p = [t locationInView:t.view]; // 获取手指的位置

  // 事务
  [CATransaction begin];                 // 开启事务
  [CATransaction setDisableActions:YES]; // 禁用隐式动画

  self.layer.position = p; // 更改可动画属性(这里是更改位置)

  [CATransaction commit]; // 提交事务
}

- (UIColor *)randomColor {

  CGFloat r = arc4random_uniform(256) / 255.0;
  CGFloat b = arc4random_uniform(256) / 255.0;
  CGFloat g = arc4random_uniform(256) / 255.0;

  return [UIColor colorWithRed:r green:g blue:b alpha:1];
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

@end

运行效果:


非根layer的隐式动画.gif

本文源码 Demo 详见 Github
https://github.com/shorfng/iOS_6.0_Graphics_and_multimedia.git




作者:蓝田(Loto)
出处: 简书

如果你觉得本篇文章对你有所帮助,请点击文章末尾下方“喜欢”
如有疑问,请通过以下方式交流:
评论区回复微信(加好友请注明“简书+称呼”)发送邮件shorfng@126.com



本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

相关文章

网友评论

    本文标题:6.2 核心动画->1.2 CALayer的创建 &

    本文链接:https://www.haomeiwen.com/subject/exbgjttx.html