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

相關文章
相關標籤/搜索