UILabel的DrawDrect方法
一、问题
如果继承UILabel实现自己的一个Label,并且在子类的DrawRect方法中留空,什么都不写,会发生什么?
代码如下:
VC
@interface ViewController () @property (nonatomic, strong) DrawTestLabel *dwLabel; @end @implementation ViewController - (DrawTestLabel *)dwLabel
{
if(!_dwLabel) {
_dwLabel = [[DrawTestLabel alloc] init];
_dwLabel.textAlignment = NSTextAlignmentCenter;
} return _dwLabel;
} - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[[self view] setBackgroundColor:[UIColor greenColor]];
[[self dwLabel] setFrame:CGRectMake(0, 0, 200, 50)];
[[self view] addSubview:[self dwLabel]];
[[self dwLabel] setText:@"Hello"];
[[self dwLabel] setCenter:[self view].center];
} @end
Label
@implementation DrawTestLabel
- (void)drawRect:(CGRect)rect {
// Drawing code
// [super drawRect:rect];
}
@end
注释调调用父类的DrawRect方法之后,会发现屏幕上面什么都没有
打开Xcode调试之后,会发现存在一个透明的图层

二、问题分析
我们知道,UIView和Layer的关系,Layer负责画面渲染,UIVIew负责事件响应;
在CALayer中通过实现 CALayerDelegate来实现画面的绘制,通常一个layer的delegate是UIView自身。
CALayerDelegate 的方法 drawlayer:incontext方法在每次绘制的时候,会调用UIView的Drawrect方法,在UIView实现了DrawRect的方法下。

那么上面自己继承的UILbel,重写Drawrect方法之后,大致的逻辑如下
1、CALayer接受到系统的回调,开始渲染
2、系统发现layer(Label)实现了Drawrect方法,那么会创建一个透明的画布,大小是UILabel的发小,scale是屏幕的scale
3、通过delegate调用Drawrect方法,在这个画布之上绘制内容
4、新的UILabel通过TextKit(底层是CoreText)来绘制文字到这个画布之上,这一段是在CPU上完成的
5、绘制完成的bitmap ,再一次Runloop循环中,会通过系统统一提交给后台的renderserver
6、render server进程处理不同的图层,通过操作GPU进行叠加渲染操作
为什么Drawrect消耗比较高?
因为绘制在CPU上面操作
绘制完成的bitmap,会通过跨进城IPC传递给render server存在系统调用消耗
render 传递内存中的bitmap到GPU的缓存上面生成纹理 ,再次产生消耗
普通的UIView通过设置属性的方式,不涉及到传递大块内存的操作,这些类似背景色、透明度、都是通过renderserver来完成的,GPU操作效率会比较高。
UILabel的DrawDrect方法的更多相关文章
- 重写UIlabel的setText:方法,过滤或者拦截text设置
因为项目中很多地方都有对UIlabel的赋值,但是text.length == 0 或者为空时并没有去给默认值,导致很多界面空间是白板, 所以不想一个一个去改.希望能重写UIlabel 的setTex ...
- 获取UILabel宽度的方法
- (CGFloat)labelLength:(NSString *)str font:(CGFloat)font{ str = ISSTRING(str) ? str : @"" ...
- UILabel的使用方法
UILabel 就是一个显示文字的控件,可以设置文字的各种属性. 构造方法: //通过设置Label的边框来初始化UILabel labelOfSlider = [[UILabelal ...
- IOS 学习笔记(4) 控件 标签(UILabel)的使用方法
虽说Label的中文翻译是标签标记,但它其实是一个静态文本内容的展现控件. 一般来说,UILabel只是一个只读的文本视图,开发者可以利用UiLabel来展示内容长度有固定上限的文字内容.并且,UIL ...
- UILabel设定行间距方法
NSString *textStr = @"iPhone规定:任何应用想访问麦克风,必须被授权麦克风服务.请进入"设置"->"隐私"->& ...
- UILabel顶部对齐解决方法(转载)
问题 我有一个UILabel高度最多能显示两行,如果里面内容只有一行,它是垂直居中的.怎么能让它顶端对齐呢? 回答 答案1:用sizeToFit改变UILabel的高度 nevan king,19 ...
- UILabel的顶对齐解决方法
对于有多行文字的UILabel而言,需要设置UILabel的numberoflines属性,此属性默认是1,也就是只显示一行,多余的会以尾部,中间的方式进行截断,具体要看你的初始设置. 在这里可以将其 ...
- IOS UIlabel设置文本距离边框距离
自定义UILabel 继承 UILabel 重写drawTextInRect 方法具体如下: CGRect rect = CGRectMake(rect.origin.x + 5, rect.orig ...
- iOS开发基础控件--UILabel
UILabel 的常见属性和方法: //创建UIlabel对象 UILabel* label = [[UILabel alloc] initWithFrame:self.view.bounds]; / ...
- iOS运用runtime全局修改UILabel的默认字体
iOS运用runtime全局修改UILabel的默认字体 一.需求背景介绍 在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊 ...
随机推荐
- Elasticsearch数据同步优化
Elasticsearch数据同步优化 背景 为了满足项目需求,需要将大量数据的数据写入到ES进行检索,预估数据量是40亿左右,目前需要同步进去的是2亿左右. ES集群配置 三台128G的国产服务器 ...
- opencv实现数据增强(图片+标签)平移,翻转,缩放,旋转
面试问到了,让手撕数据增强,图片+标签.这里整理一下,直接上代码. import math import cv2 import numpy as np def pan(img, anns, size= ...
- 必须经典GPT4.0
学习C#编程,有一些经典的教材和资源值得关注.下面列出了一些建议供你参考: 1. <C# 编程黄皮书>(C# Programming Yellow Book):Rob Miles 编著的这 ...
- 《c#高级编程》第4章C#4.0中的更改(七)——命名参数和可选参数
一.概念 C#中的命名参数和可选参数是两种函数参数的特殊形式,它们可以提高代码的可读性和灵活性. 命名参数 命名参数允许我们在调用函数时指定参数名称,从而不必按照函数定义时的参数顺序进行传参.这样做可 ...
- Oracle 将字符中含有的字母或特殊字符去除并将字符串置换成数字
将字符中含有的字母或特殊字符去除并将字符串置换成数字 将字符中含有的字母或特殊字符去除并将字符串置换成数字 to_number(nvl(TRANSLATE(u.scsqrbzl, 'qwertyuio ...
- 【笔记】go语言--go语言的依赖管理
[笔记]go语言--go语言的依赖管理 GO语言的依赖管理 依赖的概念,依赖就是第三方的库,即别人已经做好的库 依赖管理的三个阶段 GOPATH,GOVENDOR, go mod 三个阶段 - GOP ...
- 力扣1069(MySQL)-产品分析Ⅱ(简单)
题目: 编写一个 SQL 查询,按产品 id product_id 来统计每个产品的销售总量. 查询结果格式如下面例子所示: 解题思路: 没有用到product表,直接在sales表中使用聚合函数: ...
- 客户端单元测试实践——C++篇
简介: 我们团队在手淘中主要负责BehaviX模块,代码主要是一些逻辑功能,很少涉及到UI,为了减少双端不一致问题.提高性能,我们采用了将核心代码C++化的策略.由于团队项目偏底层,测试同学难以完全覆 ...
- 龙蜥正式开源 SysOM:百万级实战经验打造!一站式运维管理平台 | 龙蜥技术
简介:SysOM集监控.告警.诊断.修复.安全能力于一体的操作系统运维平台. 文/系统运维 SIG 如果你被突如其来的 OOPS 和满屏奇怪的函数弄得满头问号?机器内存明明很大,却申请不出来内存 ...
- OceanBase再破纪录!核心成员陈萌萌:坚持HTAP就是坚持我们做数据库的初心
简介: 2021年5月20日,据国际事务处理性能委员会(TPC,Transaction Processing Performance Council)官网披露,蚂蚁集团自主研发的分布式关系型数据库Oc ...