自动布局故事板约束根据子视图内容进行右对齐

时间:2015-03-30 15:37:22

标签: ios storyboard autolayout

我正在尝试设置以下布局(所有垂直居中,所以我忽略了这个方面):

|        Label          btn         View       |
|-10-|-----X-----|-10-|--30--|-10-|---Y---|-10-|
A    B           C    D      E    F       G    H
  • A - superview的左边缘
  • B - UILabel的左手边缘
  • C - UILabel的右手边
  • D - 按钮的左手边
  • E - Button的右手边缘
  • F - UIView [view]
  • 的左手边缘
  • G - UIView的右手边缘
  • H - 超级视图的右边缘

按钮宽度固定(30)。根据其他一些因素,我在运行时向[view]添加了不同的子视图。不同的子视图具有不同的宽度。

我希望Y按照添加的子视图的宽度进行缩放(最好相应地响应更改)。

我希望X占用空间的剩余部分,从而使整个集合填充超级视图的宽度。

我正在尝试使用故事板工具来解决这个问题(在运行时操纵约束和框架会使这个问题变得不同,对我来说更容易)。

我目前将间距设置为:

  • LHS标签:10,优先级1000
  • 标签到按钮:10,优先级1000
  • 按钮查看:10,优先级1000
  • 查看RHS:10,优先级1000

子视图的布局如下:

|-10-|-fixed width button-|-10-|-fixed width button-|- (no constraint) -|

还尝试过:

|-10-|-fixed width button-|-10-|-fixed width button-|-10-|

(这导致子视图的大小正确,但[view]只占用了拥抱UILabel内容大小后留下的任何空间。)

我尝试更改视图的内容拥抱和阻力属性(认为这是关键),但我可以实现的唯一结果是:

  • 固定宽度视图(忽略包含的内容)
  • 标签缩小为内容大小

具体来说,我使View的内容拥抱和压缩属性大于标签的内容,认为这会导致它拥抱内容,但我最终将标签缩小到内容的宽度和视图采取余下的。我已经阅读了这个Cocoa Autolayout: content hugging vs content compression resistance priority,但要么误解了它,要么在我的解决方案中考虑其他问题。

如果它有所不同,Label会运行两行(有时)。

1 个答案:

答案 0 :(得分:0)

来自@rdelmar的一些提示(谢谢!)。我设法找到了一个我非常满意的解决方案。

基本上,看起来我无法在故事板中执行此操作,子视图不会通过代码添加超级视图。

所以我需要添加一些约束,并且至关重要(以避免它与子视图对事物的原始理解相冲突:

[subview setTranslatesAutoresizingMaskIntoConstraints:NO];

NSMutableArray * constraints = [NSMutableArray array];
[constraints addObject:[NSLayoutConstraint constraintWithItem:subview
                                                            attribute:NSLayoutAttributeLeft
                                                            relatedBy:NSLayoutRelationEqual
                                                               toItem:view
                                                            attribute:NSLayoutAttributeLeftMargin
                                                           multiplier:1.0
                                                             constant:0]];
[constraints addObject:[NSLayoutConstraint constraintWithItem:subview
                                                            attribute:NSLayoutAttributeRight
                                                            relatedBy:NSLayoutRelationEqual 
                                                               toItem:view
                                                            attribute:NSLayoutAttributeRightMargin
                                                           multiplier:1.0
                                                             constant:0]];
[view addConstraints:constraints];

如果有人能够解释这个答案,或者确实有所改进(例如仅限故事板)那么我认为这个世界会更好。