我震惊地发现,从iOS14开始,就可以为UIStackView设置背景颜色。在旧版本中,这种尝试被忽略了
我也必须支持旧版本,所以我写了这段代码来解决这个问题:
public extension UIStackView {
private var helperSubview: UIView {
subviews.first(where: { $0.id == "helperSubview" }) ?? {
let hsv = UIView()
hsv.id = "helperSubview"
insertSubview(hsv, at: 0)
hsv.fillSuperview()
return hsv
}()
}
override var backgroundColor: UIColor? {
didSet {
if #available(iOS 14.0, *) {
return
} else {
helperSubview.backgroundColor = backgroundColor
}
}
}
}
代码运行良好
但有一个奇怪的时刻:在iOS14中,didSet
根本没有启动(就像我们甚至可以不检查#可用性一样(。这很适合我,这种行为不会造成任何问题。但我不明白为什么它会这样?
不能使用扩展来覆盖类属性。如果要覆盖任何属性或方法,则需要对UIStackView
进行子类化。
来自文档:
扩展可以为类型添加新功能,但不能覆盖现有功能