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

      在此先贴上我学习的参考博客: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,是“隐身动画属性”。

发布了40 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/ai_pple/article/details/50960876
今日推荐