部分折叠时 NSLayoutConstraints 中断

Posted

技术标签:

【中文标题】部分折叠时 NSLayoutConstraints 中断【英文标题】:NSLayoutConstraints break when Section Collapsed 【发布时间】:2014-01-02 22:46:47 【问题描述】:

我终于停止在我的应用程序中支持 ios 5,这意味着我可以调整我所有的 NIB 以使用 NSLayoutConstraint。删除我多年来放置的所有手动布局代码真的很高兴,但我遇到了一个简单的问题,似乎应该有一个简单的答案。

这是我可以重新创建它的最简单方法: 我有一个根视图控制器和一个子视图控制器。孩子从 NIB 加载它的视图。该视图有一个单独的子视图,每边保持 20 pt 的边距,由 20 pt 的顶部、前导、尾部和底部完成。

根视图控制器有一个容器视图,可以将子视图放入其中然后移动。

在 RootViewController 中:

- (void)viewDidLoad

    [super viewDidLoad];
    UIView *childView = self.childController.view;
    childView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.childContainerView addSubview: childView];

有时我会完全折叠子视图。 在 RootViewController 中:

- (IBAction)collapseChild:(id)sender

    // Adjust the height constraint on the container view
    self.childHeightConstraint.constant = 0;
    [self.view setNeedsUpdateConstraints];

当我这样做时,我得到一个错误:

无法同时满足约束。 以下列表中的至少一个约束可能是您不想要的。试试这个:(1)查看每个约束并尝试找出您不期望的; (2) 找到添加了一个或多个不需要的约束的代码并修复它。 (注意:如果您看到不理解的 NSAutoresizingMaskLayoutConstraints,请参阅 UIView 属性 translatesAutoresizingMaskIntoConstraints 的文档)

我预计是因为 topMargin (20) + bottomMargin (20) + innerViewHeight > totalHeight (0)。当我折叠视图时,如何让它不抱怨这个?

【问题讨论】:

你因为所有对孩子的提及而迷失了我。每个变量名称中都有单词 child。这里至少涉及 3 个视图,对吧?根视图、容器视图及其子视图? 将 IBOutlet 设置为底部约束,并在将 self.childHeightConstraint.constant 设置为 0 之前将其删除。 【参考方案1】:

我想出了答案,并认为最好将其发布在此处,以便对其他人有所帮助。

问题是因为所有约束都需要优先级(代码中的 UILayoutPriorityRequired 或 Interface Builder 中的 1000)。我将 Interface Builder 中的优先级降低到 999,应用程序现在知道如果必须打破该约束。

希望这可以帮助其他人在未来经历与我类似的迁移。

【讨论】:

值得一提的是,通常只要打破底部约束,让视图自然折叠/向上滑动就足够了。动画期间垂直折叠的部分就是这种情况。

以上是关于部分折叠时 NSLayoutConstraints 中断的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSLayoutConstraints 时的警告

带有 NSLayoutAttributeTrailing 的 NSLayoutConstraints 与预期不符

可折叠部分和每个部分的多个自定义 UITableViewCell

带有 NSLayoutConstraints 的 UIView 灵活高度

使 Bootstrap 3.0 NavBar 内容始终折叠

当collectionView折叠时隐藏collectionView内容