UILabel 添加 CAGradientLayer 處理流程圖 優化
如圖所示,若是 UILabel 的文本是中文,系統會添加一個 _UILabelContentLayer,將本文繪製在此層。而且會插入到 UILabel.layer.sublayers 的第一位。ui
這個時候,若是咱們把 CAGradientLayer.zPosition 設置爲負值,默認的 CALayer.zPosition = 0, 在渲染的時候,就會先渲染漸變層,而後渲染文本層。這就能夠實現用一個漸變色做爲背景的目的。atom
若是文本不包含中文,系統會把文本繪製在 UILabel.layer (_UILabelLayer) 層。此層是 CAGradientLayer 的父 layer,不管如何,都會先於 CAGradientLayer 層渲染。所以 CAGradientLayer 層渲染後,會遮蓋文本,達不到目的。spa
在 iOS14+,蘋果作了優化,即使文本包含中文,也不會添加 _UILabelContentLayer 層,直接繪製在 _UILabelLayer 層。所以,不再能實現一個 CAGradientLayer 做爲背景了。3d
只能把 CAGradientLayer 放在 UILabel 的父視圖上面,來實現漸變色背景。code
#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