iOS14+ 为 UILabel 添加 CAGradientLayer 作为背景为什么失败?
2020/7/9 23:08:46
本文主要是介绍iOS14+ 为 UILabel 添加 CAGradientLayer 作为背景为什么失败?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
UILabel 添加 CAGradientLayer 处理流程图
一、包含中文的文本,为何可以实现 CAGradientLayer 作为背景
如图所示,如果 UILabel 的文本是中文,系统会添加一个 _UILabelContentLayer,将本文绘制在此层。并且会插入到 UILabel.layer.sublayers 的第一位。
这个时候,如果我们把 CAGradientLayer.zPosition 设置为负值,默认的 CALayer.zPosition = 0, 在渲染的时候,就会先渲染渐变层,然后渲染文本层。这就可以实现用一个渐变色作为背景的目的。
二、不包含中文的文本,为何不可以实现 CAGradientLayer 作为背景
如果文本不包含中文,系统会把文本绘制在 UILabel.layer (_UILabelLayer) 层。此层是 CAGradientLayer 的父 layer,无论如何,都会先于 CAGradientLayer 层渲染。因此 CAGradientLayer 层渲染后,会遮盖文本,达不到目的。
三、iOS 14+,包含中文的文本,为何又不能实现 CAGradientLayer 作为背景
在 iOS14+,苹果做了优化,即便文本包含中文,也不会添加 _UILabelContentLayer 层,直接绘制在 _UILabelLayer 层。因此,再也不能实现一个 CAGradientLayer 作为背景了。
四、解决方法
只能把 CAGradientLayer 放在 UILabel 的父视图上面,来实现渐变色背景。
五、实验代码
#import "ViewController.h" @interface ViewController () @property (nonatomic, strong) UILabel *label; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; self.label = label; [self.view addSubview:self.label]; CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = label.bounds; gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor, (__bridge id)[[UIColor redColor] colorWithAlphaComponent:0.8].CGColor]; gradientLayer.locations = @[@0, @1.0]; gradientLayer.startPoint = CGPointMake(0, 0); gradientLayer.endPoint = CGPointMake(0, 1); [label.layer insertSublayer:gradientLayer atIndex:0]; label.text = @"中文aaaaaaa"; // label.text = @"aaaaaaaa"; gradientLayer.zPosition = -10; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSLog(@"%@", self.label.layer); NSLog(@"%@", self.label.layer.sublayers); } @end 复制代码
说明
可以分别修改文本类型,zPosition 值,验证文章中的内容。
由于 _UILabelContentLayer 不是在设置文本后就创建,而是在绘制文本的时候才创建。
因此实现了屏幕点击事件,UILabel 显示之后,点击屏幕在这里输出 layer 结构。
这篇关于iOS14+ 为 UILabel 添加 CAGradientLayer 作为背景为什么失败?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-10-05Swift语法学习--基于协议进行网络请求
- 2022-08-17Apple开发_Swift语言地标注释
- 2022-07-24Swift 初见
- 2022-05-22SwiftUI App 支持多语种 All In One
- 2022-05-10SwiftUI 组件参数简写 All In One
- 2022-04-14SwiftUI 学习笔记
- 2022-02-23Swift 文件夹和文件操作
- 2022-02-17Swift中使用KVO
- 2022-02-08Swift 汇编 String array
- 2022-01-30SwiftUI3.0页面反向传值