您的位置:首页 > 其它

CoreAnimation —— Layer

2016-11-28 00:00 225 查看
一、所有的UIView或者UIView的子类都有一个Layer,每个UIView中的Layer也是分层的,Layer主要负责视图的展示,而UIView更多的处理一系列的事件。ios中所有的动画都是由Layer来完成的(通过UIView的layer属性可以访问这个层@property(nonatomic,readonly,retain) CALayer *layer;)。

CALayer的属性
// 宽度和高度
@property CGRect  bounds;
/* 位置(默认指中点,具体由anchorPoint决定)
用来设置CALayer在父层中的位置
以父层的左上角为原点(0, 0)  */
@property CGPoint  position;
/* 锚点(x,y的范围都是0-1),决定了position的含义
称为“定位点”、“锚点”
决定着CALayer身上的哪个点会在position属性所指的位置
以自己的左上角为原点(0, 0)
它的x、y取值范围都是0~1,默认值为(0.5, 0.5) */
@property CGPoint  anchorPoint;
//设置其在父layer中的层次,默认为0,这个值越大,层次越靠上
@property CGFloat zPosition;
// 背景颜色(CGColorRef类型)
@property CGColorRef  backgroundColor;
// 形变属性
@property CATransform3D  transform;
//在Z轴上的锚点位置 3D变换时会有很大影响
@property CGFloat anchorPointZ;
// 边框颜色(CGColorRef类型)
@property CGColorRef  borderColor;
// 边框宽度
@property CGFloat  borderWidth;
// 圆角半径
@property CGColorRef  borderColor;
// 内容(比如设置为图片CGImageRef)
@property(retain) id  contents;
//获取内容的rect尺寸
@property CGRect contentsRect;
//设置内容的填充和对其方式,具体上面有说
@property(copy) NSString *contentsGravity;
//设置内容的缩放
@property CGFloat contentsScale;
//设置背景颜色
@property(nullable) CGColorRef backgroundColor;
//设置圆角半径
@property CGFloat cornerRadius;
//设置边框宽度
@property CGFloat borderWidth;
//设置边框颜色
@property(nullable) CGColorRef borderColor;
//设置透明度
@property float opacity;
//设置阴影颜色
@property(nullable) CGColorRef shadowColor;
//设置阴影透明度
@property float shadowOpacity;
//设置阴影偏移量
@property CGSize shadowOffset;
//设置阴影圆角半径
@property CGFloat shadowRadius;
//设置阴影路径
@property(nullable) CGPathRef shadowPath;
//设置内容是否完全不透明
@property(getter=isOpaque) BOOL opaque;

/* 这个属性本身也是CALayer类型,有和其他图层一样的绘制和布局属性。
它类似于一个子视图,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子视图。
不同于一般的subLayer,mask定义了父图层的可见区域,
简单点说就是最终父视图显示的形态是父视图自身和它的属性mask的交集部分。
mask图层的color属性是无关紧要的,真正重要的是它的轮廓,mask属性就像一个切割机,父视图被mask切割,
相交的部分会留下,其他的部分则被丢弃。
CALayer的蒙版图层真正厉害的地方在于蒙版图层不局限于静态图,任何有图层构成的都可以作为mask属性,
这意味着蒙版可以通过代码甚至是动画实时生成。*/
@property(nullable, strong) CALayer *mask;

常用的方法:

//重新加载绘制内容
- (void)display;
//设置内容为需要重新绘制
- (void)setNeedsDisplay;
//设置某一区域内容需要重新绘制
- (void)setNeedsDisplayInRect:(CGRect)r;
//获取是否需要重新绘制
- (BOOL)needsDisplay;
//如果需要,进行内容重绘
- (void)displayIfNeeded;
//这个属性设置为YES,当内容改变时会自动调用- (void)setNeedsDisplay函数
@property BOOL needsDisplayOnBoundsChange;
//绘制与读取内容
- (void)drawInContext:(CGContextRef)ctx;
//添加一个动画对象 key值起到id的作用,通过key值,可以取到这个动画对象
- (void)addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key;
//移除所有动画对象
- (void)removeAllAnimations;
//移除某个动画对象
- (void)removeAnimationForKey:(NSString *)key;
//获取所有动画对象的key值
- (nullable NSArray<NSString *> *)animationKeys;
//通过key值获取动画对象
- (nullable CAAnimation *)animationForKey:(NSString *)key;


图层的坐标系:



CALayer有两个重要的属性:position(坐标)和anchorPoint(锚点)

CALayer *layer = [[CALayer alloc] init];
layer.bounds = CGRectMake(0, 0, 100, 100);
// 紧贴红色的参考view
layer.position = CGPointMake(200, 200);
layer.contents = (id)[UIImage imageNamed:@"headphoto08"].CGImage;
// 让layer的中心点显示在position指定的位置上
layer.anchorPoint = CGPointMake(0.5, 0.5);
[self.view.layer addSublayer:layer];




Layer的其他作用:

// 设置尺寸
self.redView.layer.bounds = CGRectMake(0, 0, 100, 100);
// 设置边框的宽度
self.redView.layer.borderWidth = 10;
// 设置边框颜色
self.redView.layer.borderColor = [UIColor yellowColor].CGColor;
// 设置背景颜色
self.redView.layer.backgroundColor = [UIColor greenColor].CGColor;
// 设置圆角效果
self.redView.layer.cornerRadius = 30;
// 剪掉圆角以外的部分
self.redView.layer.masksToBounds = YES;
// 设置阴影的颜色
self.redView.layer.shadowColor = [UIColor redColor].CGColor;
// 设置阴影的透明度
self.redView.layer.shadowOpacity = 0.5;
// 阴影的位置(以redView左上角为原点)
self.redView.layer.shadowOffset = CGSizeMake(100, 100);
/*
*1.如果你设置了masksToBounds为YES,阴影是不出,原因,阴影也被切掉了
*2.如果你想有圆角的效果,又想有阴影,图片本来就有圆角效果
*3.获取话说:自己把图片转换成有圆角的图片,再显示
*/

二、系统的layer

1.CAEmitterLayer

CoreAnimation框架中的CAEmitterLayer是一个粒子发射器系统,负责粒子的创建和发射源属性。通过它,我们可以轻松创建出炫酷的粒子效果。

2.CAGradientLayer

CAGradientLayer可以创建出色彩渐变的图层效果,如下:



3.CAEAGLLayer

CAEAGLLayer可以通过OpenGL ES来进行界面的绘制。

4.CAReplicatorLayer

CAReplicatorLayer是一个layer容器,会对其中的subLayer进行复制和属性偏移,通过它,可以创建出类似倒影的效果,也可以进行变换复制,如下:



5.CAScrollLayer

CAScrollLayer可以支持其上管理的多个子层进行滑动,但是只能通过代码进行管理,不能进行用户点按触发。

6.CAShapeLayer

CAShapeLayer可以让我们在layer层是直接绘制出自定义的形状。

7.CATextLayer

CATextLayer可以通过字符串进行文字的绘制。

8.CATiledLayer

CATiledLayer类似瓦片视图,可以将绘制分区域进行,常用于一张大的图片的分不分绘制。

9.CATransformLayer

CATransformLayer用于构建一些3D效果的图层
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Layer