调用NSLayoutConstraint的子类的c常量变量

Calling NSLayoutConstraint's subclass'c constant variable

我创建了 NSLayoutConstraint 的自定义 class。我必须根据 iOS 版本更新顶部约束的常量值。但是 NSLayoutConstraint 的常量变量无论如何都不会被调用。我尝试了很多方法,但没有被调用。下面是我的 NSLayoutConstraint 自定义代码 class:

override var constant: CGFloat {
    set {
        super.constant = newValue
    }
    get {
        return topConstraintConstant()
    }
}

fileprivate func topConstraintConstant() -> CGFloat {
    if #available(iOS 11.0, *) {
        return 0
    }else {
        return -20
    }
}

我已经创建了 TableView 顶部约束的 IBOutlet 并为其分配了自定义 class。

您在上面的代码中不干净地覆盖了 属性 常量。如果您为 constant 分配一个值,您的实现可能 return 一个不同的值。此外,您无法 知道NSLayoutConstraint 是否使用getter 或ivar 来访问constant 的值。覆盖外国的属性 类 是非常不安全的,尤其是当它们来自 Apple 时。

子类化 NSLayoutConstraint 在这里没有必要。在极少数情况下,您应该这样做。您可以使用普通约束。如果你的约束出口变量是topConstraint你可以使用

if #available(iOS 11.0, * ) {
    topConstraint.constant = 0.0
}
else {
    topConstraint.constant = -20.0
} 

viewDidLoad.

顺便说一句:为状态栏使用固定值是一种代码味道。请改用 safeAreaLayoutGuidetopLayoutGuide 等适当的布局指南。