CALayer一些知识~

(以下内容是我查阅一些资料的整理和自己的理解,如果有不对的地方,欢迎斧正~^_^)

CALayer是什么?

CALayer是UIView中的图层,UIView的内容展示就是通过CALayer来展示的.有人可能会问UIView不是展示内容的吗,怎么会通过CALayer来展示呢?

其实UIView中不止有图层,还有子控件的位置,以及其能接受的响应事件和和事件的处理过程等等一系列的组件组合成的.而每一个UIView都有一个根CALayer来绘制和展示自己的内容.iOS中基本上所有UIView的动画都是通过CALayer来实现的.--在实现核心动画时,本质上是将CALayer中的内容转换成位图(一种图像格式),从而便于图形硬件的操纵.

我们可以用CALayer来做什么?

通过CALayer我们可以很方便的设置视图的圆角、边框、阴影及3D形变属性等等

使用CALayer时应该注意什么问题?

1.在UIView中CALayer只是一个类声明,需要添加QuartzCore框架

2.在使用颜色时,不能直接使用UIColor而需要将颜色转成CGColor

3.修改图层相当于修改UIView属性,即修改了界面属性

4.要设置阴影,需要同时指定阴影的偏移尺寸、颜色和透明度

5.形变属性既可以用形变函数指定,也可以用keyPath指定

下面就来写一段代码看看

在viewDidLoad中写上下面的代码

UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(110, 100, 100, 100)];
    [myView setBackgroundColor:[UIColor redColor]];

    [self.view addSubview:myView];

    [myView.layer setCornerRadius:50];

通过setCornerRadius方法,可以将myView视图的外观设为圆角,setCornerRadius:50 后面这个参数是设置圆角的半径,喜爱面的图片就是实现的效果

在上面的代码下面加上下面两行代码,可以给视图添加边框

 [myView.layer setBorderColor:[UIColor whiteColor].CGColor];
    [myView.layer setBorderWidth:3.0f];

可以很清楚的看出来,设置边框需要设置边框的颜色和边框的宽度,添加后运行代码效果如下所示

通过CALayer还可以给视图添加阴影,

要设置阴影效果,必须同时指定颜色、透明度、偏移量

在上面代码的基础再加上下面两行代码

  [myView.layer setShadowColor:[UIColor blackColor].CGColor];
    [myView.layer setShadowOpacity:1.0f];
    [myView.layer setShadowOffset:CGSizeMake(10, 10)];

很明显,上面代码第一行是设置阴影颜色,第二行设置阴影透明度,第三行设置阴影的偏离位置,通过调节阴影偏离位置可以调节阴影显示的位置,如果将

CGSizeMake(10, 10)  X调为0,将Y调为跟视图尺寸一样高,则会出现倒影效果如下图


但是实际使用的时候貌似有一些控件设置了Layer属性之后不生效,这事为虾米呢?

UIView是视图类的老祖宗,所有视图控件类都继承自UIView类,所以UIView类创建的对象是最纯净的,而像UIImageView和UIButton等这些控件组成比较复杂

所以他们里面的CALayer不止一个

下面来看代码~

    UIImage *image = [UIImage imageNamed:@"001"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [imageView setFrame:CGRectMake(20, 100, 280, 140)];
    [self.view addSubview:imageView];
    // 设置圆角
    [imageView.layer setCornerRadius:50];

写完上面的代码以后,展现在我们面前的应该是一张圆角图片,但是往下看-->

图片还是矩形的,并没有圆角,前面已经说了UIImageView的涂层不止一个,图片应该是没在你设置圆角的那个涂层上,这怎办呢?

虽然UIImageView有很多图层,但UIImageView继承自UIView,既然继承自UIView,他肯定有一个根图层,其他的图层都是根图层的subLayer(子图层)

然后去看一下CALayer的头文件或者google一下~就会发现CALayer有一个

@property BOOL masksToBounds;属性,按一下option看到的帮助里面貌似是说如果这个属性设置为YES,核心动画就会创建一个裁剪过得图层

尝试就一下下面设置maskToBounds的代码

[self.view setBackgroundColor:[UIColor lightGrayColor]];

    UIImage *image = [UIImage imageNamed:@"001"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [imageView setFrame:CGRectMake(20, 100, 280, 140)];
    // 在一个UIImageView中,图层不止一个,如果要设置圆角属性,需要设置一个“遮罩”属性
    // 此属性的目的是让所有图层跟随父图层一起变化
    [imageView.layer setMasksToBounds:YES];

    [self.view addSubview:imageView];

    // 1. 设置圆角
    [imageView.layer setCornerRadius:50];

再运行一下试试~

果真圆角了啊~O(∩_∩)O哈哈~

下面我们来设置一下边框和阴影会不会也出现蛋疼的问题呢?

看下面的代码~

 [self.view setBackgroundColor:[UIColor lightGrayColor]];

    UIImage *image = [UIImage imageNamed:@"001"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [imageView setFrame:CGRectMake(20, 100, 280, 140)];
    // 在一个UIImageView中,图层不止一个,如果要设置圆角属性,需要设置一个“遮罩”属性
    // 此属性的目的是让所有图层跟随父图层一起变化
    [imageView.layer setMasksToBounds:YES];

    [self.view addSubview:imageView];

    // 1. 设置圆角
    [imageView.layer setCornerRadius:50];

    // 2. 边框
    [imageView.layer setBorderWidth:5.0f];
    [imageView.layer setBorderColor:[UIColor whiteColor].CGColor];

    // 3. 阴影,如果使用阴影,遮罩属性不能设置为YES,具体使用需要取舍
    [imageView.layer setShadowOffset:CGSizeMake(10, 10)];
    [imageView.layer setShadowOpacity:1.0f];
    [imageView.layer setShadowColor:[UIColor blackColor].CGColor];

果然出现蛋疼的问题了,阴影木有粗线

介似为嘛???????google了一下,找到的答案是设置阴影的时不能设置masksToBounds = YES;??果然是熊和鱼掌不能兼得??(鱼和熊掌)

如果不设置masksToBounds会是啥情况?往下看!!!

果然果然~~~~~~见证了奇迹的时刻,阴影是出来了,圆角边框没了,但是边框是按圆角走的...好奇葩??,所以要想圆角+阴影要靠自己了

忘记这个桑心的故事把,下面来看点别的

通过CALayer还可以设置很炫的3D旋转,偏移,缩放效果结合使用效果更好哦

在上面代码的基础上插入以下代码

  // 4. 形变属性
    // 使用带Make字样的只能单独设置形变,而不带Make的形变是可以叠加的
    imageView.layer.transform = CATransform3DScale(imageView.layer.transform, 0.8, 0.8, 1.0);
    imageView.layer.transform = CATransform3DTranslate(imageView.layer.transform, 0, -100, 0);
    imageView.layer.transform = CATransform3DRotate(imageView.layer.transform, M_PI_4, 1.0, 1.0, 1.0);

通过单词就可以看出第一行是设置缩放~第二行是设置偏移~第三行是设置旋转~

看看运行效果

成这鸟样了╮(╯▽╰)╭,上面的三行代码可以一行一行试,有助于搞清楚他们都是干啥的

其实也可以通过KVC设置CALayer的属性,来改变图层的外观~(KVC是啥,请自行谷歌~)

删掉刚才加上的4.----代码,然后添加以下代码

 // 5. 使用键值路径修改形变属性
    // KVC key value coding(键值编码,被称为OC的大招!)
    // 使用KVC可以让对象之间的耦合度降低,让程序的弹性空间更大,在OC中,有一个id类型,被称为万能指针
    // 使用KVC可以间接访问对象内部的属性,前提是必须知道该对象内部属性!
    [imageView.layer setValue:@(0.5) forKeyPath:@"transform.scale"];
    [imageView.layer setValue:@(-100) forKeyPath:@"transform.translation.y"];
    [imageView.layer setValue:@(M_PI) forKeyPath:@"transform.rotation"];

看看效果

也形变了(OYE)

但是要用KVC需要知道keyPath才行%>_<%,表紧张,看看下面这张常用的表就行了,需要的时候来取就行了~


keyPath


说明


rotation.x


X轴旋转角度NSNumber


rotation.y


Y轴旋转角度NSNumber


rotation.z


Z轴旋转角度NSNumber


rotation


Z轴旋转角度NSNumber


scale.x


X轴缩放比例NSNumber


scale.y


Y轴缩放比例NSNumber


scale.z


Z轴缩放比例NSNumber


scale


三个轴缩放比例NSNumber


translation.x


X轴平移量NSNumber


translation.y


Y轴平移量NSNumber


translation.z


Z轴平移量NSNumber


translation


X,Y轴平移量的NSValue

CALayer一些知识~,布布扣,bubuko.com

时间: 2024-10-11 15:24:57

CALayer一些知识~的相关文章

CALayer一些知识~...2

那既然CALayer是负责UIView上显示内容的,那我们如果想在UIView上展示一些内容能不能直接创建CALayer然后添加到UIView上的CALayer上呢?答案是肯定的(但是CALayer不能脱离UIView直接显示给用户,必须添加到UIView上的CALayer // 1. 自定义一个子图层,添加到当前根视图中 CALayer *myLayer = [CALayer layer]; myLayer.frame = CGRectMake(0, 0, 320, 100); myLayer

CALayer一些知识~...3

CALayer回吐的先后顺序是怎样的呢?CALayer绘图时是先绘制父Layer的内容,然后绘制子Layer的内容,这样便可以让子Layer显示在父Layer上面 •要在CALayer上绘图,有两种方法: 1.创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图 2.设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法进行绘图 •注意: –不能再将UIView设置为这个CAL

iOS 知识 - 常用小技巧大杂烩 - 转载

1,打印View所有子视图 po [[self view]recursiveDescription] 2,layoutSubviews调用的调用时机 * 当视图第一次显示的时候会被调用. * 添加子视图也会调用这个方法. * 当本视图的大小发生改变的时候是会调用的. * 当子视图的frame发生改变的时候是会调用的. * 当删除子视图的时候是会调用的. 3,NSString过滤特殊字符 // 定义一个特殊字符的集合 NSCharacterSet *set = [NSCharacterSet ch

CALayer 知识:创建带阴影效果的圆角图片图层和创建自定义绘画内容图层

效果如下: KMLayerDelegate.h 1 #import <UIKit/UIKit.h> 2 3 @interface KMLayerDelegate : NSObject 4 5 @end KMLayerDelegate.m 1 #import "KMLayerDelegate.h" 2 3 @implementation KMLayerDelegate 4 5 /** 6 * 根据角度,获取对应的弧度 7 * 8 * @param degree 角度 9 *

iOS面试必备-iOS基础知识

近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是 所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用的是release,retain代表引用计 数+1,release代表引用计数-1,当引用计数减为0时

iOS关于CoreAnimation动画知识总结

一:UIKit动画 在介绍CoreAnimation动画前先简单介绍一下UIKit动画,大部分简单的动画都可以使用UIKit动画实现,如果想实现更复杂的效果,则需要使用Core Animation了:UIKit动画有两种写法:它不仅可以针对视图还可以针对其它控件: 1:第一种写法是利用属性,结合beginAnimations.commitAnimations -(void)animationOfUIKit { UIView *redView=[[UIView alloc]initWithFram

iOS CALayer视图图层

在iOS中都会牵扯到图形转换,动画效果,添加视图,等等的一系列问题,在设计页面,设计图形,添加动画的时候都会使用到这个知识. 简单的说他就是视图的图层,但又不是视图,因为视图可以和用户交互,添加响应事件,添加视图等等,但是CALayer并不可以添加响应事件等等,它只是一个视图的图层,就是这个图片的显示层,展示层,只能够显示内容,比如展示背景颜色,展示图片,设置边框,等等. UIView上面的rootLayer 发生改变的话 子图层也会发生变化 如果想要改变 button的视图形状边框等,要改变的

动画基础知识汇总

转载自http://www.cnblogs.com/kenshincui/p/3972100.html --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iO

iOS关于CoreAnimation动画知识总结(转)

一:UIKit动画 在介绍CoreAnimation动画前先简单介绍一下UIKit动画,大部分简单的动画都可以使用UIKit动画实现,如果想实现更复杂的效果,则需要使用Core Animation了:UIKit动画有两种写法:它不仅可以针对视图还可以针对其它控件: 1:第一种写法是利用属性,结合beginAnimations.commitAnimations -(void)animationOfUIKit { UIView *redView=[[UIView alloc]initWithFram