【问题标题】:Subclassing NSLayoutConstraint constant based on screen height根据屏幕高度子类化 NSLayoutConstraint 常量
【发布时间】:2017-10-19 19:58:06
【问题描述】:

我有一个带有标签栏的项目,每个标签都有一个自定义导航栏。每个导航栏 UIView 都在情节提要中设置了一个高度约束常量。

我想继承这个 NSLayoutConstraint(用于导航高度),以便它改变 iPhone X 的高度。导航栏在 iPhone X 上需要更高,因为我没有使用“out of盒子”对象,我的约束需要手动设置。

本质上,我想在子类中做如下的事情,这样我就不必重复一堆代码,做不必要的出口:

override func viewWillLayoutSubviews() {
    navBarHeightConstraint.constant = navBarHeightConstraintConstant()
}

func navBarHeightConstraintConstant() -> CGFloat {
    switch(UIScreen.main.bounds.height) {
    case 812: // iPhone X
        return 90
    default: // all others
        return 64
    }
}

我已经创建了子类,但是不知道用什么方法来执行上面的代码。

class NavHeightFixiPhoneXConstraint: NSLayoutConstraint {

    // Nothing... yet!

}

如何子类化 NSLayoutConstraint 以便它仅显示 iPhone X 的特定值?

【问题讨论】:

    标签: ios swift subclass nslayoutconstraint iphone-x


    【解决方案1】:

    您可以覆盖常量变量:

    final class NavHeightFixiPhoneXConstraint: NSLayoutConstraint {
    
        override var constant: CGFloat {
            set {
                super.constant = newValue
            }
            get {
               return navBarHeightConstant()
            }
        }
    
        private func navBarHeightConstant() -> CGFloat {
            switch (UIScreen.main.bounds.height) {
             case 812:
                return 90
             default: 
                 return 64
            }
        }
    }
    

    【讨论】:

    • 等等,我只是得到“不能用只读属性'constant'覆盖可变属性”...
    • 你是对的 ;) 该属性具有 getter 和 setter,因此您需要同时提供两者。我将编辑我的答案。
    • 工作正常,我什至把它变成了@IBDesignable :-)
    • layoutIfNeeded() in navBarHeightConstant() 将永远无法到达
    • @schmidt9 很好,我很久以前用手机写的,我也错过了函数签名中的返回,并且 NSLayoutConstraint 子类中不存在 layoutIfNeeded 函数!谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2020-09-04
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多