iOS14+ 为 UILabel 添加 CAGradientLayer 做为背景为何失败?

UILabel 添加 CAGradientLayer 处理流程图 优化

1、包含中文的文本,为什么能够实现 CAGradientLayer 做为背景

如图所示,若是 UILabel 的文本是中文,系统会添加一个 _UILabelContentLayer,将本文绘制在此层。而且会插入到 UILabel.layer.sublayers 的第一位。ui

这个时候,若是咱们把 CAGradientLayer.zPosition 设置为负值,默认的 CALayer.zPosition = 0, 在渲染的时候,就会先渲染渐变层,而后渲染文本层。这就能够实现用一个渐变色做为背景的目的。atom

2、不包含中文的文本,为什么不能够实现 CAGradientLayer 做为背景

若是文本不包含中文,系统会把文本绘制在 UILabel.layer (_UILabelLayer) 层。此层是 CAGradientLayer 的父 layer,不管如何,都会先于 CAGradientLayer 层渲染。所以 CAGradientLayer 层渲染后,会遮盖文本,达不到目的。spa

3、iOS 14+,包含中文的文本,为什么又不能实现 CAGradientLayer 做为背景

在 iOS14+,苹果作了优化,即使文本包含中文,也不会添加 _UILabelContentLayer 层,直接绘制在 _UILabelLayer 层。所以,不再能实现一个 CAGradientLayer 做为背景了。3d

4、解决方法

只能把 CAGradientLayer 放在 UILabel 的父视图上面,来实现渐变色背景。code

5、实验代码

#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 结构。cdn

相关文章
相关标签/搜索