动画—CALayer的初步学习一:CALayer属性—隐式动画(学会从博客上自学)

来源:互联网 发布:软考 数据库系统工程师 编辑:程序博客网 时间:2024/06/06 18:29

      在此先贴上我学习的参考博客:http://www.cnblogs.com/kenshincui/p/3972100.html

      CALayer基本介绍: 

         在iOS中CALayer的设计主要是了为了内容展示和动画操作,CALayer本身并不包含在UIKit中,它不能响应事件。由于CALayer在设计之初就考虑它的动画操作功能,CALayer很多属性在修改时都能形成动画效果,这种属性称为“隐式动画属性”。但是对于UIView的根图层而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的做用,如果它的属性变动形成动画效果会直接影响子图层。另外,UIView的根图层创建工作完全由iOS负责完成,无法重新创建,但是可以往根图层中添加子图层或移除子图层。

     我的理解为以下几点:1.CALayer不能响应事件   2.CALayer很多属性在修改时都能形成动画效果,这种属性还有一个名字——“隐式动画属性”   3.CALayer的根图层而言,属性的修改不能形成动画   4.UIView的根图层无法重新创建,但是可以添加(删除)子图层

   下表列出了CALayer常用的属性:     属性 说明 是否支持隐式动画 anchorPoint和中心点position重合的一个点,称为“锚点”,锚点的描述是相对于x、y位置比例而言的默认在图像中心点(0.5,0.5)的位置是backgroundColor图层背景颜色 是borderColor边框颜色是borderWidth边框宽度是bounds图层大小是contents图层显示内容,例如可以将图片作为图层内容显示是contentsRect图层显示内容的大小和位置是cornerRadius圆角半径是doubleSided图层背面是否显示,默认为YES否frame图层大小和位置,不支持隐式动画,所以CALayer中很少使用frame,通常使用bounds和position代替否hidden是否隐藏是mask图层蒙版是maskToBounds子图层是否剪切图层边界,默认为NO是 opacity透明度 ,类似于UIView的alpha是position图层中心点位置,类似于UIView的center 是shadowColor阴影颜色是shadowOffset阴影偏移量是shadowOpacity阴影透明度,注意默认为0,如果设置阴影必须设置此属性是shadowPath阴影的形状是shadowRadius阴影模糊半径是sublayers子图层是sublayerTransform子图层形变是transform图层形变是    anchorPoint属性是图层的锚点,范围在(0~1,0~1)表示在x、y轴的比例,这个点永远可以同position(中心点)重合,当图层中心点固定后,调整anchorPoint即可达到调整图层显示位置的作用(因为它永远和position重合)

////  KCMainViewController.m//  CALayer////  Created by Kenshin Cui on 14-3-22.//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#import "KCMainViewController.h"#define WIDTH 50@interface KCMainViewController ()@end@implementation KCMainViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view.    [self drawMyLayer];}#pragma mark 绘制图层-(void)drawMyLayer{    CGSize size=[UIScreen mainScreen].bounds.size;        //获得根图层    CALayer *layer=[[CALayer alloc]init];    //设置背景颜色,由于QuartzCore是跨平台框架,无法直接使用UIColor    layer.backgroundColor=[UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0].CGColor;    //设置中心点    layer.position=CGPointMake(size.width/2, size.height/2);    //设置大小    layer.bounds=CGRectMake(0, 0, WIDTH,WIDTH);    //设置圆角,当圆角半径等于矩形的一半时看起来就是一个圆形    layer.cornerRadius=WIDTH/2;    //设置阴影    layer.shadowColor=[UIColor grayColor].CGColor;    layer.shadowOffset=CGSizeMake(2, 2);    layer.shadowOpacity=.9;    //设置边框//    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];    CALayer *layer=self.view.layer.sublayers[0];    CGFloat width=layer.bounds.size.width;    if (width==WIDTH) {        width=WIDTH*4;    }else{        width=WIDTH;    }    layer.bounds=CGRectMake(0, 0, width, width);    layer.position=[touch locationInView:self.view];    layer.cornerRadius=width/2;}@end

    按照他的敲,运行:发现了一个问题:没有反应

   于是,我在if(width== WIDTH)和else两个地方设置了断点,并且打印了width的值,打印了self.view.layer.sublayers:也就是所有儿子,我发现一个奇怪的问题,width为0,这很奇怪,而且self.view.sublayers有三个对象,这就让我想要测试一下,我把self.view.layer.sublayers[0]中的0变成1,2试了一试,发现http://blog.csdn.net/wscqqlucy/article/details/84432362有反应。这个是我的一个疑问,self.view.layer 我就add了一个layer啊,所以他自己应该也有layer,哪是那些layer呢?

     于是看了另一个博客:http://blog.csdn.net/wscqqlucy/article/details/8443236 ,看了好久看到这么一句话:

当你用 addSublayer 来添加一个子图层时,他会被添加到图层层次结构的顶层,所以他会显示在现有所有子图层的最前面。用一组名为 insertSublayer 的替代方法,你可以将新视图插入现有的图层之间。

    这个说明没有加layer的时候,他自己就有两个layer,所以add 自己创建的这个layer的时候,这个layer变成了最外面的这个。至于这两个到底是哪两个,我敢肯定的是其中一个肯定是self.view.layer。

      这段代码是动态改变了layer属性中的bounds和position,是“隐身动画属性”。

0 0