-1

得知为 UIStackView 设置背景颜色的能力仅从 iOS14 开始,我感到很震惊。在旧版本中,这种尝试只是被忽略了。
我也必须支持旧版本,所以我写了这段代码来解决这个问题:

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
            }
        }
    }
}

代码工作得很好。
但是有一个奇怪的时刻:在 iOS14didSet中根本不会触发(就像我们甚至可以不检查#availability)。这适合我,这种行为不会引起任何问题。但我不明白为什么它会这样?

4

1 回答 1

-1

您不能使用扩展来覆盖类属性。UIStackView如果您想覆盖任何属性或方法,则需要子类化。

从文档:

扩展可以为类型添加新功能,但不能覆盖现有功能

于 2022-01-27T09:32:06.707 回答