IOS CALayer的属性和使用
一、CALayer的常用属性
1、@propertyCGPoint position;
图层中心点的位置,类似与UIView的center;用来设置CALayer在父层中的位置;以父层的左上角为原点(0,0);2、 @property CGPoint anchorPoint;
称『定位点』、『锚点』,该描述是相对于x、y位置比例而言的默认在图像中心点(0.5、0.5)的位置;决定着CALayer身上的哪个点会再position属性所指的位置,以自己的左上角为原点(0,0);它的x、y取值范围都是0~1。3、 @property(nullable) CGColorRef backgroundColor;
图层背景颜色4、 @property(nullable) CGColorRef borderColor;
图层边框颜色5、 @property CGFloat borderWidth;
图层边框宽度6、 @property CGRect bounds;
图层大小7、 @property(nullable, strong) id contents;
图层显示内容,例如可以将图片作为图层内容显示8、 @property CGRect contentsRect;
图层显示内容的大小和位置9、 @property CGFloat cornerRadius;
圆角半径10、 @property(getter=isDoubleSided) BOOL doubleSided;
图层背景是否显示,默认是YES11、 @property CGRect frame;
图层大小和位置,不支持隐式动画,所以CALyaer中很少使用frame,通常使用bound和position代替12、 @property(getter=isHidden) BOOL hidden;
是否隐藏13、 @property(nullable, strong) CALayer *mask;
图层蒙版14、 @property BOOL masksToBounds;
子图层是否剪切图层边界,默认是NO15、 @property float opacity;
图层透明度,类似与UIView的alpha16、 @property(nullable) CGColorRef shadowColor;
阴影颜色17、 @property CGSize shadowOffset;
阴影偏移量18、 @property float shadowOpacity;
阴影透明度,注意默认为0,如果设置阴影必须设置此属性19、 @property(nullable) CGPathRef shadowPath;
阴影形状20、 @property CGFloat shadowRadius;
阴影模糊半径21、 @property(nullable, copy) NSArray
二、CALayer不常用属性
1、 @property CGFloat zPosition;
图层中心点在z轴中的位置2、 @property CGFloat anchorPointZ;
图层在z轴中的锚点;3、 - (CGAffineTransform)affineTransform;
4、- (void)setAffineTransform:(CGAffineTransform)m;
以上属性为图层形变;该属性值指定一个CGAffineTransform对象,该对象代表对CALayer执行X、Y两个维度(也就是平面)上的旋转、缩放、位移、斜切、镜像等变换矩阵5、 @property(nullable, readonly) CALayer *superlayer;
图层的父图层
三、CALayer图层操作
1、 - (void)addSublayer:(CALayer *)layer;
添加子图层2、 - (void)removeFromSuperlayer;
将自己从父图层中移除3、 - (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx;
在自己子图层数组中的第idx位置添加图层4、 - (void)insertSublayer:(CALayer )layer below:(nullable CALayer )sibling;
将图层layer添加在子图层sibling的下面5、 - (void)insertSublayer:(CALayer )layer above:(nullable CALayer )sibling;
将图层layer添加在子图层sibling的上面6、 - (void)replaceSublayer:(CALayer )layer with:(CALayer )layer2;
将图层layer替换layer2;
四、CALayer动画操作
1、 - (void)addAnimation:(CAAnimation )anim forKey:(nullable NSString )key;
图层添加某一属性的动画2、 - (nullable NSArray< NSString > )animationKeys;
获取所有动画的属性3、 - (nullable CAAnimation )animationForKey:(NSString )key;
获取某一属性的动画4、 - (void)removeAnimationForKey:(NSString *)key;
移除某一属性动画5、 - (void)removeAllAnimations;
移除所有动画
五、隐式动画
在ios中CALayer的设计主要是为了内容展示和动画操作,CALayer本身并不包含在UIKit中,它不能响应事件。由于CALayer在设计之初就考虑它的动画操作功能,CALayer很多属性在修改时都能形成动画效果,这种属性称为『隐式动画属性』。但是对于UIView的根视图层而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的作用,如果它的属性变动形成动画效果会直接影响子图层。另外,UIView的根图层创建工作完全有iOS负责完成,无法重新创建,但是可以往根图层中添加子图层或移除子图层。
1、如何查看CALayer的某个属性是否支持隐式动画
- 可以查看头文件,看有没有Animatable,如果有表示支持;
- 查看官方文档
- 下面标明都支持隐式动画
- 可以查看头文件,看有没有Animatable,如果有表示支持;
2、例子
- #pragma mark 绘制图层
- -(void)drawMyLayer{
- CGSize size=[UIScreen mainScreen].bounds.size;
- //获得根图层
- layer=[[CALayer alloc]init];
- //设置背景颜色,由于QuartzCore是跨平台框架,无法直接使用UIColor
- layer.backgroundColor=[UIColor colorWithRed: green:/255.0 blue:1.0 alpha:1.0].CGColor;
- //设置中心点
- layer.position=CGPointMake(size.width/, size.height/);
- //设置大小
- layer.bounds=CGRectMake(, , WIDTH,WIDTH);
- //设置圆角,当圆角半径等于矩形的一半时看起来就是一个圆形
- layer.cornerRadius=WIDTH/;
- //设置阴影
- layer.shadowColor=[UIColor grayColor].CGColor;
- layer.shadowOffset=CGSizeMake(, );
- layer.shadowOpacity=.;
- //设置边框
- // layer.borderColor=[UIColor whiteColor].CGColor;
- // layer.borderWidth=1;
- //设置锚点
- // layer.anchorPoint=CGPointZero;
- [self.view.layer addSublayer:layer];
- }
- #pragma mark 点击放大
- -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
- UITouch *touch=[touches anyObject];
- CGFloat width=layer.bounds.size.width;
- if (width==WIDTH) {
- width=WIDTH*;
- }else{
- width=WIDTH;
- }
- layer.bounds=CGRectMake(, , width, width);
- layer.position=[touch locationInView:self.view];
- layer.cornerRadius=width/;
- }
七、CALayer绘图
使用Quartz 2D绘图,是直接调用UIView的drawRect:方法绘制图形、图像,这种方式的本质还是再图层中绘制。drawRect:方法是由UIKit组件进行调用,因此厘米那可以使用到一些UIKir封装的方法进行绘制,而直接绘制到图层的方法由于并非UIKit直接调用因此只能用原生的Core Graphics方法绘制;
图层绘制有两种方法,不管使用那种方法绘制完必须调用图层的setNeedDisplay方法,下面介绍图层的两种绘制方法:
(1)、通过图层代理drawLayer:inContext:方法绘制
通过代理方法进行图层呢个绘制只要指定图层的代理,然后在代理对象中重写 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;方法即可。需要注意这个方法虽然是代理方法但是不用手动实习那CALayerDelegate,因为CALayer定义中给NSObject做了分类扩展,所有的NSObject都包含这个方法。另外设置完代理后必须要调用图层的 - (void)setNeedsDisplay;方法,否测绘制内容无法显示;
例如:
- #pragma mark 绘制图层
- -(void)drawMyLayer{
- //自定义图层
- CALayer *layer=[[CALayer alloc]init];
- layer.bounds=CGRectMake(, , PHOTO_HEIGHT, PHOTO_HEIGHT);
- layer.position=CGPointMake(, );
- layer.backgroundColor=[UIColor redColor].CGColor;
- layer.cornerRadius=PHOTO_HEIGHT/;
- //注意仅仅设置圆角,对于图形而言可以正常显示,但是对于图层中绘制的图片无法正确显示
- //如果想要正确显示则必须设置masksToBounds=YES,剪切子图层
- layer.masksToBounds=YES;
- //阴影效果无法和masksToBounds同时使用,因为masksToBounds的目的就是剪切外边框,
- //而阴影效果刚好在外边框
- // layer.shadowColor=[UIColor grayColor].CGColor;
- // layer.shadowOffset=CGSizeMake(2, 2);
- // layer.shadowOpacity=1;
- //设置边框
- layer.borderColor=[UIColor whiteColor].CGColor;
- layer.borderWidth=;
- //设置图层代理
- layer.delegate=self;
- //添加图层到根图层
- [self.view.layer addSublayer:layer];
- //调用图层setNeedDisplay,否则代理方法不会被调用
- [layer setNeedsDisplay];
- }
- #pragma mark 绘制图形、图像到图层,注意参数中的ctx是图层的图形上下文,其中绘图位置也是相对图层而言的
- -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
- // NSLog(@"%@",layer);//这个图层正是上面定义的图层
- CGContextSaveGState(ctx);
- //图形上下文形变,解决图片倒立的问题
- CGContextScaleCTM(ctx, , -);
- CGContextTranslateCTM(ctx, , -PHOTO_HEIGHT);
- UIImage *image=[UIImage imageNamed:@"001.png"];
- //注意这个位置是相对于图层而言的不是屏幕
- CGContextDrawImage(ctx, CGRectMake(, , PHOTO_HEIGHT, PHOTO_HEIGHT), image.CGImage);
- // CGContextFillRect(ctx, CGRectMake(0, 0, 100, 100));
- // CGContextDrawPath(ctx, kCGPathFillStroke);
- CGContextRestoreGState(ctx);
- }
(2)、使用自定义图层绘图
在自定义图层绘图时只要自己编写一个类继承与CALayer然后在 - (void)drawInContext:(CGContextRef)ctx;中绘图即可。同前面在代理方法绘图一样,要显示图层中绘制的内容也要调用图层的 - (void)setNeedsDisplay;方法,否则 - (void)drawInContext:(CGContextRef)ctx;方法将不会调用;
例如:
- KCALayer.h
- #import "KCALayer.h"
- @implementation KCALayer
- -(void)drawInContext:(CGContextRef)ctx{
- NSLog(@"3-drawInContext:");
- NSLog(@"CGContext:%@",ctx);
- // CGContextRotateCTM(ctx, M_PI_4);
- CGContextSetRGBFillColor(ctx, 135.0/255.0, 232.0/255.0, 84.0/255.0, );
- CGContextSetRGBStrokeColor(ctx, 135.0/255.0, 232.0/255.0, 84.0/255.0, );
- // CGContextFillRect(ctx, CGRectMake(0, 0, 100, 100));
- // CGContextFillEllipseInRect(ctx, CGRectMake(50, 50, 100, 100));
- CGContextMoveToPoint(ctx, 94.5, 33.5);
- //// Star Drawing
- CGContextAddLineToPoint(ctx,104.02, 47.39);
- CGContextAddLineToPoint(ctx,120.18, 52.16);
- CGContextAddLineToPoint(ctx,109.91, 65.51);
- CGContextAddLineToPoint(ctx,110.37, 82.34);
- CGContextAddLineToPoint(ctx,94.5, 76.7);
- CGContextAddLineToPoint(ctx,78.63, 82.34);
- CGContextAddLineToPoint(ctx,79.09, 65.51);
- CGContextAddLineToPoint(ctx,68.82, 52.16);
- CGContextAddLineToPoint(ctx,84.98, 47.39);
- CGContextClosePath(ctx);
- CGContextDrawPath(ctx, kCGPathFillStroke);
- }
- @end
- ViewController.m
- #pragma mark 绘制图层
- -(void)drawMyLayer{
- KCALayer *layer=[[KCALayer alloc]init];
- layer.bounds=CGRectMake(, , , );
- layer.position=CGPointMake(,);
- layer.backgroundColor=[UIColor colorWithRed: green:/255.0 blue:1.0 alpha:1.0].CGColor;
- //显示图层
- [layer setNeedsDisplay];
- [self.view.layer addSublayer:layer];
- }
七、CALayer绘图
使用Quartz 2D绘图,是直接调用UIView的drawRect:方法绘制图形、图像,这种方式的本质还是再图层中绘制。drawRect:方法是由UIKit组件进行调用,因此厘米那可以使用到一些UIKir封装的方法进行绘制,而直接绘制到图层的方法由于并非UIKit直接调用因此只能用原生的Core Graphics方法绘制;
图层绘制有两种方法,不管使用那种方法绘制完必须调用图层的setNeedDisplay方法,下面介绍图层的两种绘制方法:
(1)、通过图层代理drawLayer:inContext:方法绘制
通过代理方法进行图层呢个绘制只要指定图层的代理,然后在代理对象中重写 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;方法即可。需要注意这个方法虽然是代理方法但是不用手动实习那CALayerDelegate,因为CALayer定义中给NSObject做了分类扩展,所有的NSObject都包含这个方法。另外设置完代理后必须要调用图层的 - (void)setNeedsDisplay;方法,否测绘制内容无法显示;
例如:
IOS CALayer的属性和使用的更多相关文章
- CALayer的属性和使用
一.CALayer的常用属性 1.@propertyCGPoint position; 图层中心点的位置,类似与UIView的center:用来设置CALayer在父层中的位置:以父层的左上角为原点( ...
- [转]IOS UIView 之属性篇
[转载自:IOS UIView 之属性篇 From CSDN] UIView 继承于UIResponder 所遵守的协议有 NSCoding .UIAppearance. UI ...
- iOS CALayer使用
CALayer使用 iOS的设备中,我们之所以能看到各种各样的控件.文字.图片,都是Core Animation框架的功劳.它通过图层的合成,最终显示在屏幕上.而今天这篇文章讲的就是Core Anim ...
- iOS开发-automaticallyAdjustsScrollViewInsets属性
iOS开发-automaticallyAdjustsScrollViewInsets属性 Available in iOS 7.0 and later. 简单点说就是automaticallyAdju ...
- IOS UITableView NSIndexPath属性讲解
IOS UITableView NSIndexPath属性讲解 查看UITableView的帮助文档我们会注意到UITableView有两个Delegate分别为:dataSource和deleg ...
- IOS学习5——属性与成员变量
[转]iOS中属性与成员变量的区别 ios中属性修饰符的作用 1. 属性用property声明 2. 简而言之,对于目前的ios开发,属性和成员变量的区别,完全可以不管. 3. 这个是历史原因造成的. ...
- IOS CALayer基本使用 (图层)
● 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层(CALayer) ● 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView 的l ...
- iOS Category 添加属性实现原理 - 关联对象
iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系.对象一开始初始化的时候其属性 ...
- iOS Core Animation学习总结(1)--CALayer常用属性
图层是core animation的基础, UIView之所以能显示在屏幕上,靠的是其内部的这个图层,即每个UIView 都有 CALayer,可通过UIView.layer或者[UIView lay ...
随机推荐
- TP5 隐藏入口文件 index.php
找到public下的.htaccess <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine ...
- 关于README的内容
如何在开发项目的时候写出标准的README文件? 为什么要写这篇博客? 关于README的编写,这个也十分的重要,如果你觉得只是随便写写,那么你就错了:编写这部分也是相当的重要的.工欲善其事,必先利其 ...
- Android的启动模式(下)
Android中的启动模式(下) 在这篇文章中,我会继续跟大家分享有关于Android中启动模式的相关知识.当然,如果对这个启动模式还不完全了解或者没有听过的话,可以先看看我之前写的有关于这个知识点的 ...
- Mac 10.12安装图片标注工具PxCook
说明:现在基本是PxCook最好用,其余都是收费的,并且支持Android标注dp,主要是用于App开发时坐标定位,求到比例等等. 下载: (链接: https://pan.baidu.com/s/1 ...
- Mono For Android中完美使用百度地图SDK(v2.1.2&v2.1.3)(转)
在Xamarin Mono For Android的开发中,如果要使用第三方的jar,就必须进行绑定.通过创建Java Bindings Library项目来自动生成C#到java的代码映射代码,最终 ...
- mvvm小论(暂记)
广州-PC26(34627) 2:09:44 在android 线程最后用 handler = new Handler(); updateThread = new Runnabl ...
- 用idea搭建一个简单的SSM的Demo
1.新建一个maven web app项目 结构如下 resources的资源文件如下 applicationContext.xml 的配置 <?xml version="1.0&q ...
- 比特 字节 兆 GB转换
bit:比特byte:拜特(字节) 1字节=8比特k:千KB:千字节 1KB = 1024 byteMB:兆字节GB:千兆字节 //少用 Kb:千比特 Mb:兆比特 Gb:千兆比特
- cnblog博客停用
本博客从今日起停止更新,后续的文章将会发布在新的博客mrbackkom.github.io
- R语言变量赋值
变量可以使用向左,向右且等于操作符来分配值.可以使用 print() 或 cat() 函数打印变量的值.cat() 函数将多个项目并成连续并打印输出. # Assignment using equal ...