繁体   English   中英

自动布局 - 使视图高度相对于超视图高度的一半

[英]autolayout - make height of view relative to half superview height

最近一直在进入自动布局,我被困在一个看起来非常微不足道的问题示例上。 我有一个视图,我想坐在屏幕顶部,占据屏幕高度的一半。 在自动布局之前很简单 - 只需将其固定到位并在父视图调整大小时告诉它垂直扩展。

现在,我一辈子都看不到该怎么做。 这是我尝试设置时得到的结果:

自动布局蓝调

底部空间约束设置为“等于 284”,当我更改为 iPhone4 布局时,这对我来说是绝对且绝对没用的,因为它在屏幕底部保留了 284 点空间,并将视图缩小到不再是一半屏幕的大小。 并且无法将该约束设置为等于任何其他视图高度的一部分。

经过一段时间的挣扎,我能想到的唯一方法是在此视图下方引入另一个视图,将它们的高度固定,让它们彼此上下放置,然后将第二个(底部)视图设置为不可见..这看起来有点难看!

我错过了一些明显的东西吗?..

故事板解决方案,您可以在其中设置任何视图之间的精确比例:

设置高度相等约束

现在:

编辑约束的乘数

利润!!!

结果

PS 另请注意,此方法适用于不同嵌套级别的视图,并且(显然)适用于宽度

PPS 有时“反转第一项和第二项”约束或设置反转乘数(例如 2 而不是 0.5)可能会有所帮助(但如果您不了解视图之间的关系,这些方法没有帮助)。

从 [至少] Xcode 5.1.1 开始,这现在可以在 IB 中实现。 虽然我花了一些时间才弄清楚它实际上非常简单:

首先创建一个基本的顶部对齐约束(您还需要像平常一样设置底部、左侧和右侧的约束)。 然后选择约束并导航到属性检查器:

以上步骤演示

然后你可以调整乘数。 如果你想要它,超级视图的 50% 将它保留在1 ,因为它是按照超级的中心对齐的。 这也是创建其他百分比的视图的好方法(例如超级视图的 25%)

上面第二步的演示

过了一会儿,我想出了以下内容。

我注意到它是一个答案,但它并不是很令人满意,因为它假设您实际上无法在 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 的乘数,作用于上视图。 我不得不将 IB 中底部垂直空间约束的优先级设置为低于 1000,以避免出现一堆关于打破约束的运行时消息。

因此,如果有人可以展示如何在 Interface Builder 中执行此操作,那将更好地回答我的问题,否则我想这已经(目前)如此出色???

比 Fyodor Volchyok 的答案更简单、更直接。 - 按住控制按钮并单击子视图。 - 仍然按住命令按钮,将光标拖动到超级视图,然后单击超级视图。 - 选择“纵横比”。

在此处输入图片说明

- 然后单击尺寸检查器。 - 然后双击约束。 在此处输入图片说明

- 确保为这两个项目选择了“高度”。 在此处输入图片说明

- 然后将一半屏幕的“乘数”更改为 0.5,或者您想要的超级视图的任何部分。 在此处输入图片说明

如果您有两个视图应该具有相同的高度,我还有另一种可能性:只需将 view2 的高度设置为 view1 的高度(这里的技巧不是明确设置 view1 的高度)。

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];

Mete 答案的 Swift 版本:

    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)


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM