如果我有 IBOutlet 约束,复杂的 UIView 布局会有所不同

Complex UIView lays out differently if I have IBOutlet for constraint

在下面的屏幕截图中,我所做的唯一更改是连接一个 IBOutlet 作为约束。未连接,屏幕布局正确。已连接,屏幕布局不正确。我以前从未见过这种情况,也不知道该如何解决。我需要能够修改约束的常量值,以便根据特定项目的存在或不存在来调整子视图的大小。

IBOutlet 声明为:

@IBOutlet weak var tabContentBottomConstraint: NSLayoutConstraint!

到目前为止,我还没有实现任何读取或修改此约束的代码。我将它添加到我的视图控制器以准备使用它,但没有进一步,因为当我 运行 添加 IBOutlet 后的代码时,视图大小不正确。我已经添加和删除了好几次,结果都是一样的。

这是连接插座之前关于视图大小调整的调试器信息:

这里是连接 IBOutlet 后的调试器信息,没有任何其他代码更改:

y 偏移量的差异很大,将视图推离屏幕。正如我上面所说,没有代码读取或写入该 IBOutlet。

rolePageDrawerView是constraint中的item2,item1是view controller的view.safeAreaLayoutGuide。 rolePageDrawerView 嵌入到 view.safeAreaLayoutGuide.

子视图的 3 层深处

我找到了一种解决这种奇怪行为的方法,方法是使用以下代码以编程方式搜索约束:

    guard let tabContentBottomConstraint = view.constraints.filter({ [=10=].secondItem! as! NSObject == rolePageTabContentView }).first else {
        fatalError("unable to find the constraint for drawer sizing")
    }
    self.tabContentBottomConstraint = tabContentBottomConstraint

我将约束保留为弱引用,即使不再注入它也是如此,因为视图本身将引用它以使其保持活动状态。有效。

但是,为了更好的解决方案,我将保留这个问题。上面的搜索是很脆弱的,以后布局会有一些变化。如果框架在不破坏布局的情况下注入约束,那就更好了。仍然开放寻求更好的解决方案。