【发布时间】: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