iOS-Core Animation

1、视图效果

1.1 圆角
    // 圆角 + 剪裁
    self.secondView.layer.cornerRadius = 20;
    self.secondView.layer.masksToBounds = YES;
1.2 图层边框
    // 圆角 + 边框 + 剪裁
    self.fourthView.layer.cornerRadius = 20;
    self.fourthView.layer.borderWidth = 2;
    self.fourthView.layer.masksToBounds = YES;
1.3 阴影
  • 简单的阴影
    //shadowOpacity: (0.0 - 1.0)(不可见 - 完全不透明)
    self.firstView.layer.shadowOpacity = 0.5f;
    //shadowColor: 阴影的颜色
    self.firstView.layer.shadowColor = [UIColor redColor].CGColor;
    //shadowOffset:阴影的方向和距离
    self.firstView.layer.shadowOffset = CGSizeMake(3, 3);
    //shadowRadius:阴影的模糊度
    self.firstView.layer.shadowRadius = 10.0f;
  • 裁剪 + 阴影
// 内层视图进行裁剪,外层视图添加阴影(外层视图透明,会按里面内容进行显示阴影)
    self.shadowLayerView.layer.cornerRadius = 20;
    self.shadowLayerView.layer.borderWidth = 5.0f;
    self.shadowLayerView.layer.masksToBounds = YES;
    self.shadowView.layer.shadowOpacity = 0.5f;
    self.shadowView.layer.shadowOffset = CGSizeMake(0.0f, 5.0f);
    self.shadowView.layer.shadowRadius = 10.0f;
阴影+裁剪.png
1.4 图层蒙版
/* 
 mask:  CALayer 类型。 mask图层定义了父图层的部分可见区域。
 mask 属性像是一个饼干切割机, mask 图层实习的部分会被保留下来,其他的则会被抛弃。
 CALayer 蒙版图层真正厉害的地方在于蒙版图不局限于静态图。任何有图层构成的都可以作为 mask 属性,这意味着你的蒙板可以通过代码甚至是动画实时生成。
*/
    CALayer *maskLayer = [CALayer layer];
    maskLayer.frame = self.imageView.bounds;
    
    UIImage *image = [UIImage imageNamed:@"Cone"];
    maskLayer.contents = (__bridge id _Nullable)(image.CGImage);
    
    // apple mask to image layer
    self.imageView.layer.mask = maskLayer;
图层蒙版
1.5 拉伸过滤
1.6 组透明

2、变换

2.1 3D变换
  • 透视投影
    // 透视投影
    CATransform3D transform = CATransform3DIdentity;
    // m34 的默认值是0,可以通过设置 m34 为-1.0/d 来应用透视效果, d 代表了想象中视角相机和屏幕之间的距离,以像素为单位,大概估算一个(500-1000)。
    transform.m34 = -1.0 / 500;
    transform = CATransform3DRotate(transform, M_PI_4, 0, 1, 0);
    imageView.layer.transform = transform;
  • 灭点

当在透视角度绘图的时候,远离相机视角的物体将会变小变远,当远离到一个极限距离,它们可能就缩放成了一个点,于是所有的物体最后都汇聚消失在同一个点。
现实中,这个点通常是视图的中心。为了在应用中创建拟真效果的透视,这个点应该聚在屏幕中心,或者至少是包含所有3D对象的视图中心。

/* 注:oneImageView 和 twoImageView 是 contentView 的子视图
 sublayerTransform 影响所有的子图层 ,CATransform3D 类型。
                    可以一次性对包含这些图层的容器做变换,于是所有的子图层都自动继承了这个变换方式
 doubleSided: 控制图层的背面是否要被绘制。BOOL类型 默认YES,   NO:当图层正面从相机视角消失的时候,它将不会被绘制
*/
    CATransform3D perspective = CATransform3DIdentity;
    perspective.m34 = - 1.0 / 500.0;
    self.contentView.layer.sublayerTransform = perspective;
    
    // 1. 逆时针旋转45度
    CATransform3D transform = CATransform3DMakeRotation(M_PI_4, 0, 1, 0);
    self.oneImageView.layer.transform = transform;
    self.oneImageView.layer.doubleSided = NO;
    
    // 2. 顺时针旋转45度
    CATransform3D transform2 = CATransform3DMakeRotation(-M_PI_4, 0, 1, 0);
    self.twoImageView.layer.transform = transform2;
    self.twoImageView.layer.doubleSided = NO;
  • 父子同时变换
    [self.view addSubview:self.outView];
    [self.outView addSubview:self.innerView];
    
    self.innerView.layer.position = [self.outView.layer convertPoint:self.outView.layer.position fromLayer:self.view.layer];
    
    CATransform3D transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);
    self.outView.layer.transform = transform;
    
    CATransform3D innerTransform = CATransform3DMakeRotation(-M_PI_4, 0, 0, 1);
    self.innerView.layer.transform = innerTransform;

3、专用图层

3.1 CAShapeLayer

CAShapeLayer 可以用来绘制所有能够通过 CGPath 来表示的形状,用UIBezierPath 创建了图层路径(矩形、椭圆、弧形、扇形、直线等)

3.2 CATextLayer

CATextLayer ,它以图层的形式包含了 UILabel 几乎所有的绘制特性( 也要比 UILabel 渲染得快)

3.3 CATransformLayer

CATransformLayer 并不平面化它的子图层,所以它能够用于构造一个层级的3D结构

3.4 CAGradientLayer

CAGradientLayer 是用来生成两种或更多颜色平滑渐变的。用 Core Graphics 复制一个 CAGradientLayer 并将内容绘制到一个普通图层的寄宿图也是有可能的,但是 CAGradientLayer 的真正好处在于绘制使用了硬件加速。

3.5 CAReplicatorLayer

CAReplicatorLayer 的目的是为了高效生成许多相似的图层。它会绘制一个或多 个图层的子图层,并在每个复制体上应用不同的变换。

3.6 CAScrollLayer
3.7 CATiledLayer

在主线程调用 UIImage 的 -imageNamed: 方法或者 -imageWithContentsOfFile:方法)将会阻塞你的用户界面,至少会引起动画卡顿现象。
CATiledLayer 为载入大图造成的性能问题提供了一个解决方案:将大图分解成 小片然后将他们单独按需载入

3.8 CAEmitterLayer

CAEmitterLayer 是一个高性能的粒子引擎,被用来创建 实时例子动画如:烟雾,火,雨等等这些效果

3.9 CAEAGLLayer

各种各样的OpenGL绘图缓冲的底层可配置项需要用 CAEAGLLayer 完成,它是 CALayer 的一个子类,用来显示任意的OpenGL图 形。

3.10 AVPlayerLayer

AVPlayerLayer 是用来在iOS上播放视频的

4、隐式动画

4.1 事务
  • CATransaction
    //begin a new transaction
    [CATransaction begin];
    //set the animation duration to 1 second
    [CATransaction setAnimationDuration:1.0];
​    //commit the transaction
    [CATransaction commit];
  • UIView
    //+ (void)beginAnimations:(nullable NSString *)animationID context:(nullable void *)context;
    [UIView beginAnimations: context:]
    //之间所有视图或者图 层属性的改变而做的动画都是由于设置了 的原因
    [UIView commitAnimations]
  • UIView +Block
    //+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations;
    [UIView animateWithDuration: animations:]
4.2 完成块
   // 用默认的事务做变换,默认的时间0.25秒
   [CATransaction setCompletionBlock:^{
    }];
// 或 
    //+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion 
    [UIView animateWithDuration: animations: completion:]

5、显示动画

5.1 CAAnimation 继承结构
CAAnimation继承结构.png

注意:上图中的黑色虚线代表”继承”某个类,红色虚线代表“遵守”某个协议
CAAnimationGroup: 组动画
CAPropertyAnimation:属性动画
CATransition:转场动画

5.2 CAAnimation
CAAnimation.png

速度控制函数(CAMediaTimingFunction)
kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。

5.3 CAPropertyAnimation
CAPropertyAnimation.png
5.4 CABasicAnimation
CABasicAnimation.png
5.5 CAKeyframeAnimation
CAKeyframeAnimation.png
5.6 CAAnimationGroup
CAAnimationGroup.png
5.7 在动画过程中取消动画

为了终止一个指定的动画,可以用如下方法把它从图层移除掉:
-(void)removeAnimationForKey:(NSString *)key;
或者移除所有动画:
-(void)removeAllAnimations;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容