一 简单介绍
CALayer 的基本属性
- 在 iOS中 我们能看得见的东西基本上都是 UIView 比如 一个按钮 一个文本标签 一个文本输入框 一个图标等等 这些都是 UIView
- 其实 UIView 之所以可以展示在屏幕上 ,是因为它内部的一个
图层
- 在创建 UIView 对象的时候 UIView 内部会自动创建一个图层即 CAlayer 对象通过 UIView 的 later 属性可以访问这个图层
- 当UIView需要显示到屏幕上时,会调用
drawRect
:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示@property(nonatomic,readonly,retain) CALayer *layer;
-
换句话说, UIView本身不具备显示的功能,拥有显示功能的是它内部的图层 。
- 其实 UIView 之所以可以展示在屏幕上 ,是因为它内部的一个
二 简单使用
- UIView之所以能够显示,完全是因为内部的CALayer对象。因此,通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:阴影、圆角大小、边框宽度和颜色
等。
- 新建一个项目,在storyboard中添加一个view
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIView * redView = [[UIView alloc]init];
redView.frame = CGRectMake(100 , 100, 100, 100);
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
#pragma mark 常用的属性
//----- 1 边框的大小
redView.layer.borderWidth = 10;
// 边框的颜色 CGColor是为了把 OC 的颜色转化为 c 的颜色
redView.layer.borderColor = [UIColor yellowColor].CGColor;
//----- 2 阴影
// 偏移量
redView.layer.shadowOffset = CGSizeMake(50, 50);
// 颜色
redView.layer.shadowColor = [UIColor blueColor].CGColor;
// 透明度(如果要显示就一定要加)
redView.layer.shadowOpacity = 1;
// 阴影的圆角半径
redView.layer.shadowRadius = 50;
//----- 3 圆角
redView.layer.cornerRadius = 50;
redView.layer.masksToBounds = YES;
//----- 4 bounds
redView.layer.bounds = CGRectMake(0, 0, 200, 200);
//----- 5 postion 属性和 view.center 的关系 默认是相等的
redView.layer.position = CGPointMake(100, 100);
// 6 设置内容(图片)
redView.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"1.jpg"].CGImage);
手动创建 layer
- (void)viewDidLoad {
[super viewDidLoad];
CALayer *layer = [CALayer layer];
// 设置大小
layer.bounds = CGRectMake(0, 0, 100, 100);
// 设置宽高
layer.position = CGPointMake(100, 100);
// 设置颜色
layer.backgroundColor = [UIColor brownColor].CGColor;
// 透明度
layer.opacity = 1;
self.myLayel = layer;
[self.view.layer addSublayer:layer];
#pragma mark 这里创建的相当于一张白纸上面涂红了 上一个则是穿件了两张纸
}
// 隐式动画
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 获取触摸对象
UITouch * t = touches.anyObject;
// 获取当前的点的位置
CGPoint p = [t locationInView:t.view];
// 设置红色的 layer 跑到手指的位置上
self.myLayel.position = p;
// 带有Animatable 这个就是可动画属性 改了可动画属性系统自动给添加的动画就是隐式动画
self.myLayel.bounds =CGRectMake(100, 100, 200, 200);
## 控件根layer 是没有隐式动画的
}
禁用隐式动画
// 开启事务
[CATransaction begin];
// 禁用隐士动画
[CATransaction setDisableActions:YES];
// 设置红色的 layer 跑到手指的位置上
self.myLayel.position = p;
// 提交事务
[CATransaction commit];
03-layer的transform属性
#import "ViewController.h"
@interface ViewController ()
/**<#描述#>*/
@property (nonatomic,weak) CALayer *myLayer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
CALayer *layer = [CALayer layer];
// 设置大小
layer.bounds = CGRectMake(0, 0, 100, 100);
// 设置宽高
layer.position = CGPointMake(100, 100);
// 设置颜色
layer.backgroundColor = [UIColor brownColor].CGColor;
// 透明度
layer.opacity = 1;
//
layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"1.jpg"].CGImage);
[self.view.layer addSublayer:layer];
self.myLayer = layer;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// affineTransform = ui里面的 transform
// 旋转 角度 和 x y z 轴
#pragma mark CATransform3DRotate 和 CATransform3DMakeRotation 前者是对于自身的基础上 另个一是转到多少度
self.myLayer.transform = CATransform3DRotate(self.myLayer.transform, M_PI_4, 0, 0, 1);
// 缩放
self.myLayer.transform = CATransform3DScale(self.myLayer.transform, 0.5, 1, 1);
// 平移
self.myLayer.transform = CATransform3DTranslate(self.myLayer.transform, 5, 5,1 );
时钟练习
#import "ViewController.h"
@interface ViewController ()
/**<#描述#>*/
@property (nonatomic,strong) CALayer *myLayer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor cyanColor];
// 创建表盘
CALayer *clock = [[CALayer alloc]init];
// 大小
clock.bounds = CGRectMake(0, 0, 200, 200);
// 位置
clock.position = CGPointMake(200, 200);
// 设置图片
clock.contents = (__bridge id _Nullable)([UIImage imageNamed:@"1.jpg"].CGImage);
clock.cornerRadius = 100;
clock.masksToBounds = YES;
// 创建一个秒针
CALayer *second = [[CALayer alloc]init];
second.bounds = CGRectMake(0, 0, 2, 60);
second.position = clock.position;
second.backgroundColor = [UIColor redColor].CGColor;
#pragma mark 新的属性 锚点 定位点
// 取值范围是从0到1的
second.anchorPoint = CGPointMake(0.5, 1);
// 添加到控制器 view 的根 layer 上
[self.view.layer addSublayer:clock];
[self.view.layer addSublayer:second];
// 添加计时器
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
self.myLayer = second;
}
//计时器的方法 1秒执行一个
- (void)timeChange {
// 1 通过 NSDate 获取当前的时间
NSDate * date= [NSDate date];
// 2 格式化时间的对象
NSDateFormatter * formatter = [NSDateFormatter new];
//
formatter.dateFormat = @"ss";
//
NSString * seconde = [formatter stringFromDate:date];
//
CGFloat secondF = [seconde floatValue];
NSLog(@"%f",secondF);
// 一秒钟的度数
CGFloat angle = 2 * M_PI / 60;
// 应该转到的角度
angle = angle * secondF;
// 旋转
self.myLayer.affineTransform = CGAffineTransformMakeRotation(angle);
}