前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Core Animation实战二(寄宿图)

Core Animation实战二(寄宿图)

作者头像
星宇大前端
发布2019-01-15 15:13:22
4310
发布2019-01-15 15:13:22
举报
文章被收录于专栏:大宇笔记

CALayer直接设置寄宿图

代码语言:javascript
复制
//
//  LayerContentViewController.m
//  LayerStudyDemo
//
//  Created by apple on 2017/9/19.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import "LayerContentViewController.h"

@interface LayerContentViewController ()

@end

@implementation LayerContentViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [self contentImageDemo];
}

//寄宿图
-(void)contentImageDemo{
    
    UIImage * image =  [UIImage imageNamed:@"timg.png"];
    
    CALayer   *  imageLayer = [CALayer layer];
    imageLayer.frame = CGRectMake(50, 200, 300, 300);
   
    //contents 图层的寄宿图 是一个CGImageRef类型,它是一个指向CGImage结构的指针
    imageLayer.contents = (__bridge id _Nullable)(image.CGImage);
   
    //contentsGravity的目的是为了决定内容在图层的边界中怎么对齐,我们将使用kCAGravityResizeAspect,它的效果等同于UIViewContentModeScaleAspectFit, 同时它还能在图层中等比例拉伸以适应图层的边界。
    imageLayer.contentsGravity = kCAGravityResizeAspect;
   
   //contentsScale属性定义了寄宿图的像素尺寸和视图大小的比例,默认情况下它是一个值为1.0的浮点数。
   //contentsScale的目的并不是那么明显。它并不是总会对屏幕上的寄宿图有影响。如果你尝试对我们的例子设置不同的值,你就会发现根本没任何影响。因为contents由于设置了contentsGravity属性,所以它已经被拉伸以适应图层的边界。
    imageLayer.contentsScale= 5.f;
   
   //我们裁切图片的时候肯定用过这个属性,是否绘制超出吧边界的视图
    imageLayer.masksToBounds = YES;
   
   //这个不用介绍了吧
    imageLayer.cornerRadius = 5.0f;
   
   //这个属性需要介绍下,我们以前见过美工给图在一张图上,我们应该怎么用呢。用这个属性我们就可以切出我们要的那一部分了。
    imageLayer.contentsRect = CGRectMake(0, 0, 0.5, 0.5);
   
   //contentsCenter其实是一个CGRect,它定义了一个固定的边框和一个在图层上可拉伸的区域。 改变contentsCenter的值并不会影响到寄宿图的显示,除非这个图层的大小改变了,你才看得到效果。
    imageLayer.contentsCenter = CGRectMake(0, 0, 0.1, 0.1);
    [self.view.layer addSublayer:imageLayer];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

Core Graphics绘制寄宿图

     CALayer有一个可选的delegate属性,实现了CALayerDelegate协议,当CALayer需要一个内容特定的信息时,就会从协议中请求。CALayerDelegate是一个非正式协议,其实就是说没有CALayerDelegate @protocol可以让你在类里面引用啦。你只需要调用你想调用的方法,CALayer会帮你做剩下的。(delegate属性被声明为id类型,所有的代理方法都是可选的)。

    当需要被重绘时,CALayer会请求它的代理给他一个寄宿图来显示。它通过调用下面这个方法做到的:

代码语言:javascript
复制
(void)displayLayer:(CALayerCALayer *)layer;

    趁着这个机会,如果代理想直接设置contents属性的话,它就可以这么做,不然没有别的方法可以调用了。如果代理不实现-displayLayer:方法,CALayer就会转而尝试调用下面这个方法:

代码语言:javascript
复制
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;

    在调用这个方法之前,CALayer创建了一个合适尺寸的空寄宿图(尺寸由boundscontentsScale决定)和一个Core Graphics的绘制上下文环境,为绘制寄宿图做准备,他作为ctx参数传入。

代码语言:javascript
复制
//
//  CoustomDrawViewController.m
//  LayerStudyDemo
//
//  Created by apple on 2017/9/22.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import "CoustomDrawViewController.h"

@interface CoustomDrawViewController ()<CALayerDelegate>

@end

@implementation CoustomDrawViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.layer.delegate = self;
    [self.view.layer display];
    
}

////layer 绘图
//-(void)customDrawingDemo{
//
//    CALayer * customLayer = [CALayer layer];
//    customLayer.frame = CGRectMake((SCREEN_WIDTH-100)/2, (SCREEN_HEIGHT-100-64)/2, 100.0f, 100.0f);
//    customLayer.backgroundColor = [UIColor yellowColor].CGColor;
//    customLayer.delegate = self;
//    customLayer.contentsScale = [UIScreen mainScreen].scale; //add layer to our view
//    [self.view.layer addSublayer:customLayer];
//    [customLayer display];
//}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    CGContextSetLineWidth(ctx, 10.0f);
    CGContextSetStrokeColorWithColor(ctx, [UIColor greenColor].CGColor);
    CGContextStrokeEllipseInRect(ctx, layer.bounds);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

DEMO地址

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年10月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CALayer直接设置寄宿图
  • Core Graphics绘制寄宿图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档