【问题标题】:IBOutlet Autolayout constraint constant changingIBOutlet Autolayout 约束常量变化
【发布时间】:2020-01-02 23:09:12
【问题描述】:

我在 Storyboard 中定义了一个自动布局约束并设置为 IBOutlet:

@IBOutlet weak var bottomPanelbottomConstraint:NSLayoutConstraint!

在情节提要中设置如下:

接下来我更改 viewDidLoad 中的常量:

override func viewDidLoad() {
    super.viewDidLoad()
    bottomPanelbottomConstraint.constant = -12
}

但我仍然在 viewDidLayoutSubviews 中发现它的常量为 -3,这是 Storyboard 中的值。怎么会这样?

编辑:以下解决方法可行,但并不理想:

 override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if bottomPanelbottomConstraint.constant == -3 {
        bottomPanelbottomConstraint.constant = -12
        bottomPanel.layoutIfNeeded()
        self.view.layoutIfNeeded()
    }
 }

【问题讨论】:

  • 可能是您在视图加载但尚未布局时设置约束。您是否尝试过在 viewDidAppear 上设置约束?另外也许你可以把bottomPanel.setNeedsLayout()?
  • 不幸的是,viewDidAppear 为时已晚。出于几个原因,我最多想在 viewDidLayoutSubviews 中做所有事情。在 viewDidLayoutSubviews 之后我有一些任务可以将 UI 挂起 0.5 左右。如果我在 viewDidAppear 中执行此操作,问题是用户可能会看到底部面板在约束更改时向上猛拉,这并不理想。
  • 视图应该在viewDidLayoutSubviews中布局,对吗?或者子视图仍然可以在 viewDidLayoutSubviews 中等待更新?
  • 您告诉系统为不同的特征使用特定的常量值......然后您试图通过代码覆盖它。决定是否要使用特征变体或代码。
  • 好吧,我也想在故事板中直观地看到。我只在纵向模式下通过位偏移量来调整 iPhone X 或 iPad 的一些值。因为无法在 Storyboard 中调整特定设备的值,只能针对特征变化。

标签: ios swift uiviewcontroller autolayout uistoryboard


【解决方案1】:

您应该在更改常量后调用layoutIfNeeded()。它将立即导致布局的强制更新。

【讨论】:

  • 我确实在 self.view 上调用它,甚至在底部面板上也是如此。但是没有效果!
  • 哦。那么我认为这可能是由于冲突的约束。
  • 但是在我添加另一个不相关的子视图后它又变回了-12!
  • 主要问题是重置为故事板值,这很奇怪。没有约束冲突。
  • 您真的需要所有这些尺寸类常量吗?
猜你喜欢
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2019-10-12
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多