NSLayoutConstraint 常量没有更新

Posted

技术标签:

【中文标题】NSLayoutConstraint 常量没有更新【英文标题】:NSLayoutConstraint constant is not updating 【发布时间】:2017-05-09 16:41:50 【问题描述】:

如果设备是 iPhone SE,我想更新约束。

我有一个 xib 视图控制器,我将它的视图添加为子视图。

    //get the empty view
    let emptyVC = JobsEmptyStateView(nibName: "JobsEmptyStateView", bundle: nil)
    let emptyView = emptyVC.view!
    emptyView.frame = self.view.frame

    self.navigationController?.view.insertSubview(emptyView, belowSubview: (self.navigationController?.navigationBar)!)

在 JobsEmptyStateView 我有

@IBOutlet weak var headerLabelTopLayout: NSLayoutConstraint!

我也尝试将其设置为private var

最后我有一个类来决定设备是否是 iPhoneSE

class func emptyStateHeaderLabelTopLayout() -> CGFloat? 

    let device = Device()

    if device.isOneOf(smallScreenDevices) 
        if Constants.isDevicePortrait()
        
            return 200
        
        return 200

    

    return nil

在 JobsEmptyStateView 中:

override func viewDidLoad() 

        if let topConstant = Constants.emptyStateHeaderLabelTopLayout()
        
                //self.headerLabelTopLayout.isActive = true
                print(self.headerLabelTopLayout.constant)
                print(topConstant)
                self.headerLabelTopLayout.constant = topConstant
                print(self.headerLabelTopLayout.constant)
                self.view.setNeedsUpdateConstraints()
                self.view.layoutIfNeeded()
                print(self.headerLabelTopLayout.constant)

        

    

打印:

70.0
200.0
200.0
70.0

为什么约束没有得到更新?

【问题讨论】:

我想知道它是否结合了 (1) 实例化 JobsEmptyStateView 的实例(恕我直言,这是一个名称不佳的 UIViewController),(2)处理 viewDidLoad,(3)更新weak 约束和 then (4) 使用添加了 VC 的 UIView 作为完全不同的视图层次结构中的子视图(显然,一个未命名的视图控制器)。除了更新常量之外,您还想从高层次上做什么? 【参考方案1】:

尝试删除wR hC 约束,只让值70

【讨论】:

为什么?我希望能够将 wR hC 用于横向模式。 因为有时我的 Xcode 会创建一些我没有要求它创建的约束,而不是 self.view.setNeedsUpdateConstraints() 尝试 self.view.updateConstraints() 我会接受这个答案,但我必须承认 wR 和 hC 无法正常工作是非常愚蠢的,我必须以编程方式处理所有情况 你的问题解决了吗?如果没有,我们可以讨论它。 是的,删除它们有效。但同样没有意义,wR hC 必须在viewdidload 之后以编程方式覆盖设置值,因此删除它们并以编程方式处理纵向和横向的所有可能情况

以上是关于NSLayoutConstraint 常量没有更新的主要内容,如果未能解决你的问题,请参考以下文章

如何更新之前在代码中设置的 NSLayoutConstraint 常量? - 斯威夫特

更改 NSLayoutConstraint 的常量

在 iOS7 中设置 NSLayoutConstraint 常量

根据视图的高度或屏幕高度设置 NSLayoutConstraint 常量

NSLayoutConstraint 的默认常量是啥?

安全地更改 NSLayoutConstraint 常量值