iOS核心动画(基础篇)

2019-05-27  本文已影响0人  柯浩然

Core Animation相关内容基本介绍

此框架把屏幕上的内容组合起来,这个内容被分解成图层,放到图层树中,这个树形成了你能在应用程序看到的内容的基础

图层在iOS中就是CALayer
当我们创建一个UIView类的时候就会同时创建这个类的layer属性。 而UIViewCALayer分工明确。

UIView类确切的知道响应链,可以响应事件。
UIView封装了CALayer的部分功能。比如UIView中的framecenter属性对应CALayer中的frameposition
UIView还封装了高级API使动画更简单。
UIView还具有自动排版、布局的功能

CALayerUIView的内部实现细节,真正负责屏幕上的显示和动画。
CALayer的部分属性并没有被UIView暴露。比如:
~ 阴影、圆角、带颜色的边框
~ 3D变换(后面会讲到UIView只可以做仿射变换)
~ 透明遮罩

最好使用使用视图而不是单独的图层的原因之一有:视图可以进行自动布局,自适应屏幕的翻转。而图层是做不到这样的

对于何时使用CALayer。可以参考如下条件:

在讲解Core Animation之前需要先讲讲一些基础知识

1. iOS中使用的坐标系统:
2. CALayer设置contents属性

※ contentsGravity

※ contentsScale

※ contentsRect

※ contentsCenter

在开发中苹果建议在UIView中不要实现一个空的drawRect:方法。这是因为实现这个方法的View会生成一个寄宿图。这个寄宿图就是CALayer的contents属性。

tip:contentsGravity设置的选项是没有拉伸图片的话,这个属性的设置才会有显而易见的效果。

例如:设置为{0.25,0.25,0.5,0.5},那么图层的四个边角的内容不变,而其他区域内容在图层大小(由contentsGravity决定)改变的时候就可拉伸。

3. 图层几何学

布局

  1. frame代表了图层的外部坐标(在父图层上占用的空间),bounds是内部坐标,center和position代表了本图层的anchorPoint在父图层的位置

坐标系

  1. 一个图层的position依赖于它的父图层的bounds。如果父图层发生移动,子图层也会跟着移动
  1. 和UIView严格的二维坐标不同的是,CALayer存在于一个三维空间中。除了x轴和y轴,还有一个z轴的存在。有两个属性可以描述在z轴的位置zPositionanchorPointZ

可能会用到的API

  1. 坐标系的转换:把一个图层坐标系下的点或矩形装换成另一个图层或坐标系的点
- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer;

- (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer;

- (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;

- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;
  1. CALayer判断点的位置
//接受一个在本图层坐标系下的点,如果这个点在图层范围内就返回YES
- (BOOL)containsPoint:(CGPoint)p;
//返回能接收这个点的最远CALayer子代。如果这个点在最外面图层的范围之外,则返回nil
//如果设置了zPosition,返回的就不一定是最前方的Layer
- (CALayer *)hitTest:(CGPoint)p;
4. 视觉效果属性

× 圆角cornerRadius

× 图层边框borderColorborderWidth

× 阴影shadowOffsetshadowColor

与直接指定shadowPath 相比,图层的阴影根据图层内容动态计算阴影的形状。比较消耗性能

因为图层的阴影总是在图层范围外,所以直接使用maskToBounds的时候会把阴影给裁剪掉。
一、可以添加一个专门显示阴影的图层来得到maskToBounds + shadow的效果
二、指定shadowPath

× 图层蒙版mask属性 —— 是一个CALayer类型,定义了父图层的部分可见区域。

mask图层最重要的是它的轮廓,赋值了mask属性,就会按照mask图层的形状把父视图进行切割,保留mask图层内的父视图内容,舍弃图层外的父视图内容

× 拉伸过滤Filter —— 当图片需要显示不同大小的时候,拉伸过滤的算法就起到作用了。CALayer有三种过滤算法

默认的过滤算法为linear,trilinear比 linear能够更好的支持大图;对于比较小的图或者是差异特别明显,极少斜线的大图,使用Neareset可以呈现更好的效果。

× 组透明GroupOpacity——整个图层树有一个整体的透明效果还是进行透明度的混合叠加

× 光栅化shouldRasterize —— YES代表图层及其子图层会被整合成一个整体的图片

5. 变换

→ 仿射变换affineTransform

是`CGAffineTransform`类型。`Core Graphics`框架对象。提供如下函数创建:
CGAffineTransformMakeRotation(CGFloat angle)
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)

使用如下函数,初始化生成一个什么都不做的变换,也就是创建一个CGAffineTransform类型的空值,矩阵论中称作单位矩阵

CGAffineTransformIdentity

混合两个已经存在的变换矩阵,使用如下方法,在两个变换的基础上创建一个新的变换:

CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2);

→ 3D变换transform3D

→ 固体对象

图书地址

上一篇下一篇

猜你喜欢

热点阅读