【问题标题】:What happens with constraints when a view is removed删除视图时约束会发生什么
【发布时间】:2013-09-08 04:56:02
【问题描述】:

我的问题很简单,但我在文档中找不到任何信息。

当视图从视图层次结构中移除(或移动到另一个视图)时,布局约束会发生什么情况?

例如,让我们有容器C 与子视图AB。容器C 有一些约束。然后我们打电话给[A removeFromSuperview]A 的约束会发生什么?

如果我们再次将A 添加到C 会发生什么?

【问题讨论】:

    标签: ios autolayout nslayoutconstraint


    【解决方案1】:

    约束被移除。如果再次添加 A,则必须为其创建新的约束,或者如果在删除 A 之前保存约束,则可以重新添加它们。当我做这样的事情时,我会为一个名为 view1 的视图保存这样的约束:

    self.portraitConstraints = [NSMutableArray new];
    for (NSLayoutConstraint *con in self.view.constraints) {
        if (con.firstItem == self.view1 || con.secondItem == self.view1) {
           [self.portraitConstraints addObject:con];
        }
    }
    

    【讨论】:

    • 可以在文档的某处找到这个事实吗?我相信你,但在任何地方都没有提到这一事实似乎很奇怪。
    • 通常情况下,约束会随着视图一起被移除。如果它们不是,那么布局系统将如何在未来的通道中评估它们?
    • 这个答案看起来很明显,但它仍然非常有帮助!
    • @pnollet,我不知道那个问题中的发帖人为什么会这样做。我已经记录了这个来验证,当我删除一个子视图并检查超级视图上的约束时,那些与被删除的子视图有关的约束已经消失了。
    • @Firo,我确定它们应该被删除,所以如果它们不在 iOS 6 中,那可能是一个错误。顺便说一句,removeFromSuperview 方法的文档说,“调用此方法会删除引用您要删除的视图或引用您要删除的视图的子树中的任何视图的任何约束”。
    【解决方案2】:

    当你[A removeFromSuperview]时,约束也会被删除

    它们被遗忘了,再次将 A 添加到 C 不会增加任何约束。

    【讨论】:

      【解决方案3】:

      它们也被删除了,你可以做一个简单的测试。拿起一个视图 SUBVIEW 并创建约束 SUBVIEW 跟随其父视图大小调整的约束(如附加到父视图边缘)。为此,您将 SUBVIEW 作为子视图添加到此 CONTAINERVIEW 并添加为约束,如下所示:
      五:|-[SUBVIEW]-|
      H:|-[SUBVIEW]-|
      这些约束应该被添加到 SUBVIEW 超级视图,即 CONTAINERVIEW。
      如果您通过简单地检查所有 CONTAINERVIEW 约束来删除 SUBVIEW,您会发现其中两个不再存在。

      【讨论】:

        【解决方案4】:

        因为我也有这个问题,所以我检查了 Apple Docs,结果发现限制已被删除。

        UIView removeFromSuperview 方法的documentation 声明:

        调用此方法会删除任何引用您的视图的约束 正在删除,或者引用您视图的子树中的任何视图 正在删除。

        我不确定去年发布原始问题时是否记录了这一点,但我只是想我会分享这些信息以防万一有人需要...

        【讨论】:

        • 非常感谢您直接从文档中添加此内容
        【解决方案5】:

        但请注意,如果您有两个独立的父视图 A 和 B,以及一个子视图 C,其中 C 当前是 A 的子视图,具有适当的约束,则调用 [B addSubview:C] 不会清除任何约束与 A 和 C 相关,并且自动布局将开始抛出异常,因为这些约束不再与同一层次结构中的视图相关。

        在将 C 添加到 B 之前,您需要显式调用 [C removeFromSuperview] 以移除约束。

        这在 Mac OS X 上是正确的 - 我还没有检查过 iOS

        【讨论】:

        • 有趣!你从哪里得到这些信息的? addSubview 的文档没有提到这种行为。我问是因为我目前有一个零星的异常,当删除一个视图控制器时,它指出“无法在视图上安装约束”——这是我没有做的。
        【解决方案6】:

        这个问题也可以通过界面生成器来证明。当在ViewController 上拖放UIView 添加约束然后删除UIView,可以看到蓝色约束消失了。

        【讨论】:

        • Storyboard 无法证明运行时行为将如何发生。 Storyboard 可以为所欲为!
        猜你喜欢
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        相关资源
        最近更新 更多