这里每天共享一个 iOS 的新知识,快来重视我吧
UIStackView
UIStackView
是在 iOS 9 中推出的一个新的视图类。用于在横向或纵向中安置视图调集的简化界面。随着最低版别的进步,目前在日常的开发中运用 UIStackView
现已越来越多了。
设置布景色彩无效的问题
最近发现一个小问题,给 UIStackView
设置布景色彩之后,在 iOS 13 及以下的设备中无效。
UIStackView
尽管继承自 UIView
,但它不是 UIView 的普通子类。在 iOS 13 之前,它一直都是一个 “非烘托子类”,也便是不参与烘托,只用作布局。因此当你设置其 backgroundColor
后没有任何作用。
一般的做法是在 UIStackView
中刺进一个新的 UIView
,来作为布景,比方下边这个扩展的实现。
extension UIStackView {
func addBackground(color: UIColor) {
let subView = UIView(frame: bounds)
subView.backgroundColor = color
subView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
insertSubview(subView, at: 0)
}
}
运用的时候能够这样写:
stackView.addBackground(color: .red)
iOS 14 对此做了优化,在 iOS 14 上是能够正常经过 backgroundColor
设置布景色彩的,因此这个扩展中能够加入对版别的判断:
extension UIStackView {
func addBackground(color: UIColor) {
if #available(iOS 14.0, *) {
backgroundColor = color
} else {
let subView = UIView(frame: bounds)
subView.backgroundColor = color
subView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
insertSubview(subView, at: 0)
}
}
}
iOS 14 做了什么
接下来探求一下为什么在 iOS 14 中就能够正常设置布景色彩了。
一个首要的改动是在 iOS 14 中, UIStackView
的内部 layer 已从本来的 CATransformLayer
更改为运用 CALayer
。
CATransformLayer
能够用来创建 3D 图层层次结构,与 CALayer
不同的地方在于,它不会把自己烘托出来。这就意味着它会忽略 backgroundColor
等属性。
证明这一点很简单,咱们只需要在 iOS 13 和 iOS 14 的控制台打印一下 UIStackView
对象:
在 iOS 13 上:
(lldb) po rootStackView
<UIStackView: 0x7fdc0270b3c0; frame = (0 0; 0 0);
layer = <CATransformLayer: 0x600002de3e40>>
能够看到其对应的 layer
对象是 CATransformLayer
。
在 iOS 14 上:
(lldb) po rootStackView
<UIStackView: 0x7fa253f0bdc0; frame = (0 0; 0 0);
layer = <CALayer: 0x600003339440>>
能够看到其对应的 layer
对象是 CALayer
。
因为 iOS 14 上用的是 CALayer
,所以咱们能够像操作正常的 UIView
一样对 UIStackView
进行设置了。但是假如你的使用兼容 iOS 14 以下系统,还需要做好兼容性适配。
本文同步自微信公众号 “iOS新知”,每天按时共享一个新知识,这里仅仅同步,想要及时学到就来重视我吧!