OC - 21.CALayer核心要点及实例解析

CALayer基础


  • CALayer是每一个UI控件的核心,一个UI控件之所以能显示可以说是CALayer的功劳
  • 每一个UI控件默认都为自己创建一个CALayer对象,通过drawRect方法将内容绘制在图层上,然后再显示出来
  • CALayer可以完成很多任务

    • 调整UI控件的外观
    • 执行动画
  • CALayer与UIView

    • 二者可以达到相同的显示效果
    • UIView比CALayer多了用户交互功能
    • CALayer更加轻量级,性能更好
  • CALayer在系统架构中的位置

    • CALayer位于QuartzCore框架中适用于iOS与Mac OS X
    • 其中的属性类型如:CGImageRef、CGColorRef位于CoreGraphic框架中适用于iOS与Mac OS X
    • 又如:UIImage、UIColor位于UIKit框架中只适用于iOS
    • 系统架构图如下:

CALayer的常用属性


  • frame属性

    • bounds(CGRect),尺寸
    • position(CGPoint),显示在父控件中的位置,以父控件左上角为原点
    • anchorPoint(CGPoint),决定该控件上的哪个点显示在position位置,x,y的取值范围都是0~1,默认为(0.5, 0.5)
    • transform(CATransform3D),形变属性,包括位置和尺寸
  • border属性

    • cornerRadius(CGFloat),圆角属性,若控件的宽高相等,且圆角属性为宽/高的一半,则为圆形,原理如图

    • borderWidth(CGFloat),边框的宽度

    ,与contentInsets的效果相似

    • borderColor(CGColorRef),边框颜色
  • appearance属性

    • backgroundColor(CGColorRef),背景颜色
    • opacity(CGFloat),透明度,取值范围为0~1
    • maskToBounds(BOOL),是否不显示超出控件边界的内容,若设置cornerRadius,该属性需要赋值为YES(iOS9,不用设置)
  • content属性

    • contents(id) 内容,可以设置为图片

  • backgroundColor、content与border的层次关系,如图

position与anchorPoint


  • position属性决定该控件在父控件中的位置,以父控件的左上角为原点
  • anchorPoint属性决定该控件上的哪个点位于position位置
  • 示例

    • 若position为(100, 100),anchorPoint为(0, 0 ),如图

    • 若position为(100, 100),anchorPoint为(0.5, 0.5),如图

CALayer的简单使用


  • 创建一个CALayer对象imageLayer,并添加到控制器View的layer上

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100); imageLayer.position = CGPointMake(100, 200); //将图层添加到控制器view的layer上 [self.view.layer addSublayer:imageLayer];
  • 设置背景图片

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100); imageLayer.position = CGPointMake(100, 200); //设置背景颜色 imageLayer.backgroundColor = [UIColor orangeColor].CGColor; //将图层添加到控制器view的layer上 [self.view.layer addSublayer:imageLayer];
    • 显示效果如图

  • 设置imageLayer的内容为一张图片

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100); imageLayer.position = CGPointMake(100, 200); //在图层上添加一张图片 imageLayer.contents = (id)[UIImage imageNamed:@"Ali"].CGImage; //将图层添加到控制器view的layer上 [self.view.layer addSublayer:imageLayer];
    • 显示效果如图

  • 设置圆角属性

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100); imageLayer.position = CGPointMake(100, 200); //设置圆角属性 imageLayer.cornerRadius = 20; imageLayer.masksToBounds = YES; //该属性在iOS9中不用设置 //在图层上添加一张图片 imageLayer.contents = (id)[UIImage imageNamed:@"Ali"].CGImage; //将图层添加到控制器view的layer上 [self.view.layer addSublayer:imageLayer];
    • 显示效果如图

  • 设置边框属性

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100); imageLayer.position = CGPointMake(100, 200); //设置圆角属性 imageLayer.cornerRadius = 20; imageLayer.masksToBounds = YES; //设置border属性 imageLayer.borderWidth = 2; imageLayer.borderColor = [UIColor purpleColor].CGColor; //在图层上添加一张图片 imageLayer.contents = (id)[UIImage imageNamed:@"Ali"].CGImage; //将图层添加到控制器view的layer上 [self.view.layer addSublayer:imageLayer];
    • 显示效果如图

自定义CALayer的方法


  • 方法一:创建CALayer对象,并设置其代理

    • 创建CALayer对象

      //创建图层
      CALayer *imageLayer = [[CALayer alloc] init];
      //设置代理
      imageLayer.delegate = self; //设置图层的位置和尺寸 imageLayer.bounds = CGRectMake(0, 0, 100, 100); imageLayer.position = CGPointMake(100, 200); //重绘 [imageLayer setNeedsDisplay]; //将图层添加到控制器view的layer上 [self.view.layer addSublayer:imageLayer];
    • 实现代理方法,在该方法中绘制图层的内容

      - (void)drawLayer:(nonnull CALayer *)layer inContext:(nonnull CGContextRef)ctx { //通过绘图方法绘制内容 }
  • 方法二:自定义CALayer类的子类

    • 自定义CALayer的子类ImageLayer

      //重写该方法,绘制图层的内容
      - (void)drawInContext:(nonnull CGContextRef)ctx
      {
      	//通过绘图方法绘制内容 }
    • 创建ImageLayer的实例

      ImageLayer *imageLayer = [[ImageLayer alloc] init]; [self.view.layer addSublayer:imageLayer];

       

 
 

转载于:https://www.cnblogs.com/funny11/p/4961847.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在iOS上使用Objective-C实现动态壁纸功能,您可以按照以下步骤进行: 1.创建一个新的Xcode项目,并选择Single View Application模板。 2.在Assets.xcassets中创建包含动态壁纸图像的图像集。 3.在AppDelegate.m文件中添加以下代码,以在应用程序启动时注册动态壁纸: ``` - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Register for dynamic wallpapers NSDictionary *wallpaperOptions = @{UIApplicationRegisteredDefaultDynamicWallpaperOptions : @{}}; [[UIApplication sharedApplication] registerForRemoteNotificationsMatchingTypes:UIRemoteNotificationTypeNone categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeNone categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications]; [[UIApplication sharedApplication] registerForRemoteNotificationsWithOptions:wallpaperOptions error:nil]; return YES; } ``` 4.在Info.plist文件中添加以下键/值对,以允许应用程序在后台运行: ``` <key>UIBackgroundModes</key> <array> <string>remote-notification</string> </array> ``` 5.在AppDelegate.m文件中添加以下代码,以处理接收到的动态壁纸: ``` - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSString *dynamicWallpaperURLString = userInfo[UIApplicationDynamicWallpaperContentIdentifierKey]; NSURL *dynamicWallpaperURL = [NSURL URLWithString:dynamicWallpaperURLString]; // Download and set the dynamic wallpaper } ``` 6.下载动态壁纸图像并将其设置为应用程序的背景。您可以使用以下代码之一: a.使用UIImageView: ``` UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.clipsToBounds = YES; [imageView loadImageWithURL:dynamicWallpaperURL]; [self.view addSubview:imageView]; ``` b.使用CALayer: ``` CALayer *layer = [[CALayer alloc] init]; layer.contentsGravity = kCAGravityResizeAspectFill; layer.masksToBounds = YES; layer.contents = [NSData dataWithContentsOfURL:dynamicWallpaperURL]; [self.view.layer insertSublayer:layer atIndex:0]; ``` 7.运行应用程序并测试您的动态壁纸功能。 请注意,为了使动态壁纸功能正常工作,您需要在应用程序启动时注册动态壁纸,并在接收到远程通知时处理动态壁纸。您还需要确保应用程序在后台运行以接收通知。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值