自定义Layer的两种方法

view的完整显示过程:

  1.view.layer会准备一个Layer Graphics Context(图层类型上下文)

  2.调用view.layer.delegate(即view)的drawLayer:inContext:并传入准备好的上下文

  3.view的drawLayer:inContext:方法内部会调用view的drawRect:方法

  4.view就可以在drawRect:方法中实现绘图,所有东西都会绘制到view.layer上

  5.系统再将view.layer内容拷贝到屏幕上,完成显示

 1 //
 2 //  ViewController.m
 3 //  calayer,自定义Layer
 4 //
 5 //  Created by ys on 15/11/21.
 6 //  Copyright (c) 2015年 ys. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10 #import "ysLayer.h"
11 /**
12  *  ysLayer.h及.m文件内容
13
14  #import <QuartzCore/QuartzCore.h>
15  @interface ysLayer : CALayer
16  @end
17
18  #import "ysLayer.h"
19  @implementation ysLayer
20  -(void)drawInContext:(CGContextRef)ctx
21  {
22     CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 50, 50));
23     CGContextSetRGBFillColor(ctx, 0, 0, 1, 1.0);
24     CGContextFillPath(ctx);
25  }
26
27  @end
28  */
29
30
31 @interface ViewController ()
32
33 @end
34
35 @implementation ViewController
36
37 - (void)viewDidLoad {
38     [super viewDidLoad];
39     [self diyLayer2];
40     [self diyLayer1];
41 }
42
43 -(BOOL)prefersStatusBarHidden
44 {
45     return YES;
46 }
47
48
49 -(void)diyLayer1
50 {
51     ysLayer *layer = [[ysLayer alloc]init];
52     layer.backgroundColor = [UIColor redColor].CGColor;
53     layer.bounds = CGRectMake(0, 0, 200, 200);
54     layer.anchorPoint = CGPointMake(0, 0);
55     [self.view.layer addSublayer:layer];
56     [layer setNeedsDisplay];
57 }
58
59
60 -(void)diyLayer2
61 {
62     CALayer *layer = [[CALayer alloc]init];
63     layer.backgroundColor = [UIColor blackColor].CGColor;
64     layer.bounds = CGRectMake(0, 0, 200, 200);
65     layer.position = CGPointMake(0, 200);
66     layer.anchorPoint = CGPointZero;
67     layer.delegate = self;//继承自NSObject的类都可以作为Layer的代理
68     [self.view.layer addSublayer:layer];
69     [layer setNeedsDisplay];
70 }
71
72 //代理方法
73 -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
74 {
75     CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 50, 50));
76     CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);
77     CGContextFillPath(ctx);
78 }
79
80 @end
时间: 2024-10-22 16:54:48

自定义Layer的两种方法的相关文章

iOS 自定义layer的两种方式

在iOS中,你能看得见摸得着的东西基本都是UIView,比如一个按钮,一个标签,一个文本输入框,这些都是UIView: 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个图层 @property(nonatomic,readonly,retain) CALayer *layer; 每一个UIView内部都默认关联一个CALayer,我们可称这个Laye

http的get字符串类型和post自定义类的两种方法--测试成功

1. string类型的参数,get方法 /// <summary> /// 执行服务的方法 /// </summary> /// <param name="MethodName">方法名称</param> /// <param name="pars">参数列表</param> /// <param name="_type">返回值类型</param>

自定义Cell的 两种方法!

1.通过xib自定义cell* 添加tableView* 加载团购数据* 新建xib,获取子控件* 封装* 最后引入headerView和footerView(插入广告,加载更多) 2.通过代码自定义cell* 引入UITableViewController* 加载模型数据,用自带的cell展示基本数据* 新建一个Cell,封装模型数据* 在init方法中添加4个子控件* 在set方法中给子控件设置数据* 在set方法中给子控件计算frame* 说明cell的高度无法计算* 设计Frame,返回

【原】自定义tableViewCell的两种方法

1.通过xib文件创建自定义cell ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UITableViewController<UITableViewDelegate, UITableViewDataSource> @property (strong, nonatomic) NSArray *listTeams; @end ViewController.m #import "Vie

Apache服务器自定义404页面的两种方法以及.htaccess的重要命令总结

Apache服务器自定义404错误页面有两种方法: 第一种方法最简单,直接在Apache的httpd.conf下进行配置修改命令,修改的内容请参看.htaccess命令写法中的自定义错误页面 第二种方法可以在.htaccess文件中配置命令,具体操作请参看.htaccess命令写法中的自定义错误页面 .htaccess使用方法总结 1 . 首先让的本地APACHE服务器器允许.htaccess修改 打开httpd.conf (1) Options FollowSymLinks AllowOver

ios 文字渐变色实现的两种方法

前段时间我写过一个文字渐变色的demo, 最近又在网上看到一个新的设置文字渐变色的方法, 就把这两种方法分享出来吧, 我认为应该还有好多种方法, 以后看到后再补充. 效果图: 其实这两种方法实现原理及思路是差不多的, 只是使用的类和方法不一样. (一)_ 自定义label, 实现 drawRect 方法, 在该方法里面画渐变色 思路: 1)_ 把label的文字画到context上去(画文字的作用主要是设置 layer 的mask) CGContextRef context = UIGraphi

Linux中生成密钥的两种方法

Linux中生成密钥的两种方法 SSH服务支持一种安全认证机制,即密钥认证.所谓的密钥认证,实际上是使用一对加密字符串,一个称为公钥(publickey), 任何人都可以看到其内容,用于加密:另一个称为密钥(privatekey),只有拥有者才能看到,用于解密.通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难. ssh的密钥认证就是使用了这一特性.服务器和客户端都各自拥有自己的公钥和密钥.如何使用密钥认证登录linux服务器呢? 在使用密钥认证远程登入linux之前,我们

zabbix使用自己编写脚本模板和zabbix自带模板两种方法添加对指定进程和端口的监控

zabbix使用自己编写脚本模板和zabbix自带模板两种方法添加对指定进程和端口的监控 1.自带监控模板进行os的监控 进入/usr/local/zabbix/etc/zabbix_agentd.conf 配置文件修改 LogRemoteCommands=1     ###开启脚本功能 Server=192.168.5.129     ##修改zabbix指向的服务器: 重启zabbix_agentd.zabbix_server服务 在配置-->主机-->添加主机--> 配置主机信息主

(转)java创建线程的两种方法比较

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法:  ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承