自动布局 – 使视angular相对于超级景观高度的一半
最近已经进入了自动布局,我被卡在似乎是一个非常微不足道的问题的例子。 我有一个观点,我想坐在屏幕的顶部,占据屏幕高度的一半。 在自动布局之前简单 – 只需将其粘贴到位,并在超级视图resize时告诉它垂直展开。
现在,我不能为我的生活看到如何去做。 以下是我尝试设置的内容:
底部空间约束被设置为“等于284”,这是绝对的,当我改变到iPhone4的布局时,对我来说绝对没用,因为它在屏幕底部保留了284个点的空间,并缩小了视图不再是一半屏幕的大小。 而且没有办法将这个约束设置成等于任何其他视图高度的一部分。
经过一段时间的努力之后,我能想到的唯一方法就是在这个视图的下面引入另一个视图,同样地固定它们的高度,让它们坐在上面和下面,然后将第二个(底部)视图设置为不可见..这似乎有点难看!
我错过了什么明显的?
现在可以在IB中使用Xcode 5.1.1。 虽然我花了一段时间才弄清楚它实际上是非常简单的:
首先创build一个基本的顶部alignment约束(您也需要设置底部,左侧和右侧的约束,像正常一样)。 然后select约束并导航到“ 属性”检查器:
然后你可以调整乘数。 如果你想让超级视图的50%保持为1
,因为它是按照超级中心alignment的。 这也是创build其他百分比视图的好方法(比如25%的超视图)
故事板解决scheme,您可以在任何视图之间设置精确比例:
现在:
利润!!!
PS还要注意,这种方法适用于不同嵌套层次的视图,(显然)适用于宽度
PPS有时可能有助于“约束第一和第二项”或设置反向乘数(例如2而不是0.5)(但是如果不了解视图之间的相互关系,这些方法是无用的)。
多花一点时间,我想出了以下几点。
我把它当作答案来注意,但是它不是很令人满意,因为它假定你不能在Interface Builder中做到这一点,但是之后可以在代码中添加正确的约束:
- (void) viewWillAppear:(BOOL)animated { NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview attribute:NSLayoutAttributeHeight relatedBy:0 toItem:self.view attribute:NSLayoutAttributeHeight multiplier:.5 constant:0]; [self.view addConstraint:constraint]; }
基本上,它对self.view的高度设置0.5的乘数,作用在upperview上。 我不得不在1B中将底部垂直空间约束的优先级设置为低于1000,以避免关于破坏约束的一堆运行时消息。
所以如果任何人都可以展示如何在界面生成器中做到这一点,那么最好能回答我的问题,否则我想这是一样好(现在)?
如果你有两个视图应该有相同的高度,那么我还有另外一种可能性:只要将view2的高度设置为view1的高度(这里的技巧并不是明确地设置view1的高度)。
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]" options:0 metrics:nil views:viewsDict]];
比方法比Fyodor Volchyok的答案稍微容易和更直接。 – 按住控制button并点击子视图。 – 只需按住命令button,将光标拖到超级视图,然后单击超级视图。 – select“长宽比”。
– 然后单击大小检查器。 然后双击约束。
– 确保为这两个项目select了“高度”。
然后,将“乘数”更改为0.5,用于屏幕的一半,或者您希望的超视图的任何分数。
Mete的答案的迅速版本:
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. upperView.translatesAutoresizingMaskIntoConstraints = false var constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0) self.view.addConstraint(constraint) constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.height, multiplier: 0.5, constant: 0) self.view.addConstraint(constraint) constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 0) self.view.addConstraint(constraint) constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: 0) self.view.addConstraint(constraint) }
- 在Xcode的debugging控制台输出中禁用自动布局约束错误消息
- iOS AutoLayout多行UILabel
- 自动布局:什么创build了名为UIView-Encapsulated-Layout-Width&Height的约束?
- 我可以在同一视图上使用setFrame和自动布局吗?
- 自动布局dynamic调整uilabel宽度
- 以编程方式更新高度约束
- 使用自动布局在UICollectionView中指定单元的一个维度
- 在debuggingautolayout时,autoresizing掩码string的含义是什么,例如h = – &v = – & – ?
- NSInvalidUnarchiveOperationException:无法实例化名为NSLayoutConstraint的类