以下都是 Xcode Debug 检测结果
一、常用的控件 layer.masksToBounds 不产生离屏渲染的情况:
1、UILabel(无论有无背景和text)、
2、UIImageView(无论有无背景和image)
3、UIButton(无论有无背景和title, 有 image 不行)
4、UIView子视图无任何可显示的背景颜色、图片或者文字时
二、 layer.masksToBounds 产生离屏渲染的情况
1、UIButton 设置了 image 时
2、UIView 的子视图有背景色,或者有文字、图片时
可以得出:
1、视图设置阴影必定产生离屏渲染。
2、有子视图,并且子视图有颜色、文字、图片可显示的情况,父视图使用 layer.masksToBounds 就会产生离屏渲染。
3、有可显示的子视图中,设置父视图的alpha,0 < alpha < 1 就会产生离屏渲染。
4、毛玻璃效果UIVisualEffect
三、化解设置阴影产生离屏渲染
someView.layer.shadowColor = UIColor.brown.cgColor
someView.layer.shadowOffset = CGSize(width: 4, height: 4)
someView.layer.shadowOpacity = 0.8
// 设置阴影后,加上shadowPath路径,提前告诉CoreAnimation你要渲染的View的形状Shape,就会减少离屏渲染计算
someView.layer.shadowPath = UIBezierPath(rect: someView.bounds).cgPath
// 如果 someView 设置了圆角则用:
// someView.layer.shadowPath = UIBezierPath(roundedRect: someView.bounds, cornerRadius: 20).cgPath