iOS自动布局问题

Posted

技术标签:

【中文标题】iOS自动布局问题【英文标题】:iOS Auto Layout issue 【发布时间】:2014-03-18 07:32:39 【问题描述】:

我正在尝试以编程方式进行约束。我在 IB 中创建了 textField 和按钮。这是代码:

UIView *superview = self.view;

self.button.translatesAutoresizingMaskIntoConstraints = NO;
self.textField.translatesAutoresizingMaskIntoConstraints = NO;

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.textField
                                                              attribute:NSLayoutAttributeCenterY
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:superview
                                                              attribute:NSLayoutAttributeCenterY
                                                             multiplier:1.0f
                                                                constant:0];
[superview addConstraint:constraint];

constraint = [NSLayoutConstraint constraintWithItem:self.textField
                                          attribute:NSLayoutAttributeCenterX
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:superview
                                          attribute:NSLayoutAttributeCenterX
                                         multiplier:1.0f
                                           constant:0];
[superview addConstraint:constraint];

constraint =[NSLayoutConstraint constraintWithItem:self.button
                                           attribute:NSLayoutAttributeTrailing
                                           relatedBy:NSLayoutRelationEqual
                                              toItem:self.textField
                                           attribute:NSLayoutAttributeLeading
                                          multiplier:1
                                            constant:-10];

[superview addConstraint:constraint];

constraint =[NSLayoutConstraint constraintWithItem:self.button
                                           attribute:NSLayoutAttributeBaseline
                                           relatedBy:NSLayoutRelationEqual
                                              toItem:self.textField
                                           attribute:NSLayoutAttributeBaseline
                                          multiplier:1
                                            constant:0];

[superview addConstraint:constraint];

运行后我遇到了这个问题: 约束也对视图没有影响。 我做错了什么?

【问题讨论】:

Handosomeguy 是正确的。是否有任何特殊原因让您以编程方式添加更多约束? 我不想添加“更多”约束。我只想在 IB 中创建 UIViews 并在代码中制作所有约束(用于教育目的)。因此,在创建新约束之前,我需要从这个 UIViews 中删除所有约束,但如果 UIView 是在 IB 中创建的,它们似乎无法删除! 您可以在 IB 占位符约束中创建在运行时不退出的每个约束,在面板检查器中检查“在运行时删除”复选框(i,m 在 ipad anche 上可以现在不检查)。使用这些选项,ib 约束将在运行时被移除,您可以从头开始。因为老问题是由于您可能要求删除到错误的视图或在错误的“时刻” 【参考方案1】:

首先在情节提要编辑器中选择要更改的视图控制器,然后在约束编辑器中选择“在视图控制器中添加缺少的约束” 通过删除和添加新约束来选择您想在运行时修改的元素,在对象检查器面板中选择每个约束并通过选中“占位符:在构建时删除”框进行编辑。

这是一种向情节提要编辑器说您对不应该应用的约束条件很好的方式,或者抱怨约束条件不足的情况。 标记的约束在运行时被删除,所以你应该提供你自己的约束,如果你在正确的地方做会更好。在视图控制器中覆盖 -updateViewConstraints 并记住调用 super 并添加新的约束。

【讨论】:

【参考方案2】:

您有三个自动生成的约束“IB 在构建时为固定框架的视图自动生成”。这些与您自己制作的冲突。您可能在 Interface Builder 中的文本字段和按钮上设置了固定大小的属性。可能您的按钮上有固定宽度,这与尾随约束冲突。

将 IB 与代码约束结合起来可能会很棘手。我发现仅在 IB 中或仅在代码中进行设计以避免此类冲突通常更容易,尽管将两者结合起来是完全可行的。

关于 NSIBPrototypingLayoutConstraint 是什么的一个很好的解释,看看这个 SO 答案: Trouble with AutoLayout on UITableViewCell

【讨论】:

我想要的只是在 IB 中创建这个 textField 和按钮,但以编程方式设置所有约束。我不想合并任何东西,这就是为什么我将所有视图的 translatesAutoresizingMaskIntoConstraints 设置为 NO 你确定 IB 没有限制? 有默认的约束,我没有在那里做自己的约束。 您是否检查了我链接到的其他答案?您自己的约束和 IB 的约束之间肯定存在冲突。尝试该帖子中的建议。 问题是我没有限制在情节提要中选择:(

以上是关于iOS自动布局问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 自动布局与 iOS 8 自适应布局,有区别吗?

自动布局和 ios5

iOS自动布局重置我所有的图像位置

在 iOS 8 中如何在不使用自动布局的情况下布局 UITableViewCell?

iOS 7 与 iOS 8 自动布局问题

iOS scrollView自动布局技巧之二 - 纯代码自动布局