如何使用自动布局在其父视图的一半中启动视图?

Posted

技术标签:

【中文标题】如何使用自动布局在其父视图的一半中启动视图?【英文标题】:How do I use auto layout to start a view in the half of its superview? 【发布时间】:2013-01-08 09:02:22 【问题描述】:

我在视图中有一个视图:

+--------------+
|              |
|       +-----+|
|       |     ||
|       +-----+|
+--------------+

我希望内部视图始终从外部视图的中间水平开始,并将整个剩余的一半跨越到右边缘:

innerView.frame.size.width = outerView.frame.size.width/2;
innerView.frame.origin.x = outerView.frame.size.width/2;

如何使用自动布局来表达?

【问题讨论】:

【参考方案1】:

您实际上可以在 IB/Storyboards 中做到这一点,早在 Xcode 5.1(可能更早)

    在视图和超级视图之间创建宽度约束 将其关系设置为“相等” 将其常量设置为“0” 将其乘数设置为“2:1”或“1:2”(取决于约束中的项目顺序)

显然,IB 只允许将乘数设置为整​​数或比率,而不是浮点数。这是一个更清晰的屏幕截图

注意:如果“第一项”和“第二项”翻转,则比例为“2:1”

【讨论】:

如何添加这样的约束? 您想了解第 1 步的更多细节吗?如果是这样,一种方法是在子视图和它的超级视图之间按 ctrl+click+drag 并选择“Equal Widths”。这将创建一个比例为 1:1 的宽度约束,然后您需要选择新创建的约束(从左侧的视图树或两个视图中的任何一个的大小检查器),并更改乘数如上所述 该选项已被禁用,或者实际上对我来说甚至都不存在。我只看到前导/尾随空格'n东西...:/ 你也可以选择两个视图,点击右下角的pin菜单,选择“等宽” 由于某种原因,该选项总是被禁用。我不知道为什么。我在 XIB 中,而不是故事板,如果这有什么不同的话。我的 superview 是 UITableViewCell 的内容视图。【参考方案2】:

我认为你不能在 Interface Builder 中做到这一点,但通过在代码中创建约束很容易做到这一点。

您的第一个方程式正是我表达约束的方式。第二个等式可能有效,但将原点与宽度联系起来很奇怪。它们是不同的数量。相反,只需将 innerView 的右侧固定到 outerView 的右侧即可。

我们使用属性NSLayoutAttributeTrailing而不是NSLayoutAttributeRight,所以你的界面在本地化RTL时会正确翻转。

// innerView.width = outerView.width * 0.5
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:innerView
                             attribute:NSLayoutAttributeWidth
                             relatedBy:NSLayoutRelationEqual
                                toItem:outerView
                             attribute:NSLayoutAttributeWidth
                            multiplier:0.5
                              constant:0];

// innerView.trailing = outerView.trailing
NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:innerView
                             attribute:NSLayoutAttributeTrailing
                             relatedBy:NSLayoutRelationEqual
                                toItem:outerView
                             attribute:NSLayoutAttributeTrailing
                            multiplier:1.0
                              constant:0];

[outerView addConstraints:@[widthConstraint, rightConstraint]];

【讨论】:

【参考方案3】:

您可以放入父视图的中间并删除界面生成器中的所有自动布局设置。如果您旋转它,它将始终处于同一位置事件。

【讨论】:

以上是关于如何使用自动布局在其父视图的一半中启动视图?的主要内容,如果未能解决你的问题,请参考以下文章

使用 iOS 自动布局在子视图控制器与其父视图之间建立约束

自动布局 - 使视图的尺寸依赖于另一个视图的

iOS 自动布局 - 当您想让视图拉伸到其父级的完整大小时,正确的方法是啥?

使用自动布局进行编辑时在表格视图中调整子视图的大小

Xcode 6 - 另一个自动布局视图中的自动布局视图

使用 Masonry 向视图的子视图添加自动布局约束