layer 的常用属性

本文介绍了 iOS 开发中 CALayer 的基本属性与使用方法,包括如何通过操作 CALayer 调整 UIView 的界面属性,例如边框、阴影、圆角等,并展示了手动创建 CALayer 的过程及利用其 transform 属性实现视图的旋转、缩放和平移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 简单介绍

CALayer 的基本属性
  • 在 iOS中 我们能看得见的东西基本上都是 UIView 比如 一个按钮 一个文本标签 一个文本输入框 一个图标等等 这些都是 UIView
    • 其实 UIView 之所以可以展示在屏幕上 ,是因为它内部的一个图层
    • 在创建 UIView 对象的时候 UIView 内部会自动创建一个图层即 CAlayer 对象通过 UIView 的 later 属性可以访问这个图层
    • 当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示
      @property(nonatomic,readonly,retain) CALayer *layer;
    • 换句话说, 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);





}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值