iOS开发小白学习体验-CALayer的一些整理

来源:互联网 发布:java socket 长链接 编辑:程序博客网 时间:2024/05/20 19:14

    • CALayer
      • 简介
      • CGColorRef和CGImageRef数据类型

CALayer

简介

UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层

@property(nonatomic,readonly,retain) CALayer *layer; 

当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示

换句话说,UIView本身不具备显示的功能,拥有显示功能的是它内部的图层。

UIView之所以能够显示,完全是因为内部的CALayer对象。因此,通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:阴影、圆角大小、边框宽度和颜色等。

1.通过layer设置边框的宽度和颜色

//设置边框的宽度为20 self.customView.layer.borderWidth=20;//设置边框的颜色self.customView.layer.borderColor=[UIColor greenColor].CGColor;

2.设置layer的圆角

//设置layer的圆角self.customView.layer.cornerRadius=20;

3.在layer上添加图片

//在view的图层上添加一个image,contents表示接受内容self.customView.layer.contents=(id)[UIImage imageNamed:@"me"].CGImage;

说明:contents是id类型,可以接受内容,上面的实例让layer显示一张图片,仔细观察可以发现四个圆角的部分露了一个角出来。

这是因为CALayer下面还有一个CustormView的视图。然而修改的圆角是再CAlayer(主图层)上的。设置的image不是展示在主图层上的,而是显示在子图层上的。可以通过设置一个范围,设置超出主图层的部分把它给剪切掉。
有以下两种方法,建议使用layer中的方法(第二种)self.customView.layer.masksToBounds=YES;

第一种:

//设置超过子图层的部分裁减掉//UI框架中使用的方法self.customView.clipsToBounds=YES;

第二种:

//设置超过子图层的部分裁减掉//layer中使用的方法self.customView.layer.masksToBounds=YES;

注:layer中不能直接接受UI框架中的东西

4.设置阴影

设置阴影,不光需要设置阴影颜色,还应该设置阴影的偏移位和透明度
因为如果不设置偏移位的话,那么阴影和layer完全重叠,且默认透明度为0(即完全透明)

//设置阴影的颜色 self.customView.layer.shadowColor=[UIColor blackColor].CGColor; //设置阴影的偏移量,如果为正数,则代表为往右边偏移 self.customView.layer.shadowOffset=CGSizeMake(15, 5); //设置阴影的透明度(0~1之间,0表示完全透明)self.customView.layer.shadowOpacity=0.6;注意:如果设置了超过主图层的部分减掉,则设置阴影不会有显示效果

5.隐式动画

    self.myLayer = [CALayer layer];#pragma mark - 隐式动画    /**     *  每个UIView内部都默认关联着一个CALayer,我们可以称这个Layer为Root Layer(根层)     *      代码表现为: self.view.layer(这个是在ViewController里的表示)     *  所有的非Root Layer,也就是手动创建的CALayer对象,都存在隐式动画     */    // 设置bounds才能显示出layer    self.myLayer.bounds = CGRectMake(0, 0, 50, 80);    self.myLayer.backgroundColor = [UIColor yellowColor].CGColor;    /**     *  position:位置,指的是layer相较与父层(0,0)的位置。     *  layer的具体位置由两个值确定,position是一个重要的值     *  另一个是参数anchorPoint     *       *  anchorPoint:锚点,定位点,决定了哪个点会在position属性所指的位置     *  换个说法就是,position这个点是由layer的哪个点来扮演的。     *  anchorPoint的值(x,y)的取值范围都是0~1     *  我更倾向于把这个范围当成是0%~100%,也许比例定位更加形象一点     *  在没有给anchorPoint赋值的情况下,默认是(x:0.5,y:0.5)     */    self.myLayer.position = CGPointMake(50, 50);    self.myLayer.anchorPoint = CGPointMake(0, 0);    self.myLayer.cornerRadius = 20;// cornerRadius layer的圆角    /**     *  那么什么是隐式动画?     *      每当对非Root Layer的部分属性进行修改的时候,默认自动产生一些动画效果     *      这些属性被称为 Animatable Properties (可动画属性)     *  常见的 Animatable Properties:     *      bounds:用于设置CALayer的宽度和高度.修改这个属性会产生缩放     *      backgroundColor:用于设置CALayer的背景颜色.修改这个属性会产生背景色的渐变动画     *      position:用于设置CALayer的位置.修改这个属性会产生平移动画     *       *  想知道更多的animatable的属性,请查看API->CALayer Animatable Properties     *  注意:隐式动画只会出现一次。     *     */    // 添加layer    [self.view.layer addSublayer:self.myLayer];    ...- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    [CATransaction begin];    [CATransaction setDisableActions:YES];    // 1.创建核心动画    CABasicAnimation *animation = [CABasicAnimation animation];    // 1.1告诉系统要执行什么样的动画    animation.keyPath = @"position";    // 设置通过动画,将layer从哪儿移动到哪儿    animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)];    // 1.2设置动画执行完毕之后不删除动画    animation.removedOnCompletion = NO;    // 1.3设置保存动画的最新状态    animation.fillMode = kCAFillModeForwards;    // 隐式动画    [CATransaction commit];    self.myLayer.bounds = CGRectMake(0, 0, 150, 240);    self.myLayer.backgroundColor = [UIColor grayColor].CGColor;    [self.myLayer addAnimation:animation forKey:nil];}

CGColorRef和CGImageRef数据类型

1.简单说明

CALayer是定义在QuartzCore框架中的;CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的;UIColor、UIImage是定义在UIKit框架中的

其次,QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用,但是UIKit只能在iOS中使用

因此,为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef

不过很多情况下,可以通过UIKit对象的特定方法,得到CoreGraphics对象,比如UIImage的CGImage方法可以返回一个CGImageRef

2.UIView和CALayer的选择

可以发现,前面的2个效果不仅可以通过添加层来实现,还可以通过添加UIView来实现。如显示图片的层可以用一个UIImageView来实现。 既然CALayer和UIView都能实现相同的显示效果,那究竟该选择谁好呢?

其实,对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以。

所以,在选择的过程中,需要考虑到实际的情况,如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以

当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级

添加子layer

怎么创建,怎么设置在前面的代码中都有体现,这里只写怎么添加到界面上//1.创建一个layer//2.设置layer的属性(一定要设置位置,颜色属性才能显示出来)//3.把layer添加到界面上[self.view.layer addSublayer:layer];说明:在添加layer之前,控制器view上layer有两个子layer,添加之后,有三个子layer

访问层

CALayer *layer=[CALayer layer]; layer.backgroundColor=[UIColor brownColor].CGColor; layer.bounds=CGRectMake(0, 0, 200, 200); layer.position=CGPointMake(100, 100);[self.view.layer addSublayer:layer];//CALayer通过sublayers属性访问所有的子层NSLog(@"%@",self.view.layer.sublayers[2]);NSLog(@"%@",layer);//CALayer也可以通过superlayer属性访问父层NSLog(@"%@",layer.superlayer);NSLog(@"%@",self.view.layer);UIView可以通过subviews属性访问所有的子视图,类似地,CALayer也可以通过sublayers属性访问所有的子层UIView可以通过superview属性访问父视图,类似地,CALayer也可以通过superlayer属性访问父层特别注意:如果一个控件是另外一个控件的子控件,那么这个控件的layer也是另一个控件的子layer。
0 0
原创粉丝点击