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

时间:2018-12-16 23:45:25

标签: ios swift uiview uiviewcontroller nslayoutconstraint

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

IBOutlet声明为:

@IBOutlet weak var tabContentBottomConstraint: NSLayoutConstraint!

到目前为止,我还没有实现任何读取或修改此约束的代码。我将其添加到我的视图控制器中以准备使用它,但是并没有做进一步的事情,因为在添加IBOutlet之后运行代码时,视图大小不正确。我添加和删除了几次,总是得到相同的结果。

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

enter image description here

这是在连接IBOutlet之后没有任何其他代码更改的情况下的调试器信息:

enter image description here

y偏移量的差异很大,并将视图推离屏幕。就像我在上面说的那样,没有代码读取或写入该IBOutlet。

rolePageDrawerView是约束中的item2,而item1是视图控制器的view.safeAreaLayoutGuide。 rolePageDrawerView嵌入view.safeAreaLayoutGuide的子视图的3个层次中。

1 个答案:

答案 0 :(得分:0)

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

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

即使不再注入约束,我也将其作为弱引用,因为视图本身将对其进行引用以使其保持活动状态。可以。

但是,我想提出一个更好的解决方案。上面的搜索在将来某些布局更改时非常脆弱。如果框架在不破坏布局的情况下注入约束,那就更好了。仍然开放寻求更好的解决方案。