创build一个基于百分比的iOS布局

我试图复制一个我目前在Android应用程序中使用的布局,但是我不知道如何在iOS中进行,尤其是因为iPhone 5的高度。

我知道如何用“Android”术语来解释这一点,但是我一直在尝试在iOS上这样做,但是我无法完成它的工作。

最好的解释办法是:

  1. 我想要两个布局。 顶部布局必须占用40%,底部必须占用60%。
  2. 在顶部布局,他们必须是三个button,填补所有可能的空间(基本上是1/3的空间)
  3. 在底部布局中,我需要一个imageView,然后是一个textView。

这是一个油漆模型。 这在iOS中可以做到吗? 我觉得布局比android更难创build。

在这里输入图像说明

使用Xcode 6.0,现在可以在Interface Builder中指定比例宽度或高度。 从超级视图百分比高度的步骤:

虽然子视图和超视图都被选中,但是添加一个“等高”约束(或者如果你希望有一个比例宽度,则等于“宽度”)。

在这里输入图像说明

然后,将刚添加的约束的“乘数”更改为您所需的比例。 例如,对于50%,将其更改为2。

如果您想要将内部视图指定为超级视图的百分比,则可以反转约束中的项目:

在这里输入图像说明

现在你可以使用0.5的倍数(或者你需要的任何其他比例):

在这里输入图像说明

在你的具体情况下,你可以在两个子视图之间定义一个“等高”的约束条件,把乘数改为1.5(最下面的是1.5的顶部大小)或0.6667(如果项目颠倒了)。

与其他答案相反,我认为你至less应该考虑自动布局系统。 它的创build是为了更容易地构build可预测的布局,就像你所描述的那样。 Autolayout 受到布局中视图的限制 。 您可以以可视化或编程方式创build这些约束。 在视觉上,你的第一个看法是这样的:

视觉约束

您看到的蓝色线条有许多约束条件,用于指定button间距,button周围的空间以及button的高度和宽度。 你可以看到一个对他们有一个约束的约束 – 我select了所有的三个button,并给他们一个“等高”约束。

有一个很好的视觉格式语法 ,可以让你将约束描述为string。 花一点时间看看链接的文档 – 不需要太长的时间,学习到足够的东西,你可以阅读string。 例如,您的顶部布局可以像这样指定:

 V:[button1]-[button2(==button1)]-[button3(==button1)] 

括号==button1告诉布局系统使button2button3的高度与button1相同。 -表示button之间应该使用标准间距; 你可以指定一个不同的间距,如果你想。 对于10点间距,请这样做:

 V:|-10-[button1]-10-[button2(==button1)]-10-[button3(==button1)]-10-| 

一旦你有这样一个string,你可以把它变成一个约束使用的方法: +[NSLayoutConstraint constraintsWithVisualFormat:options:metrics:views:]

一些约束条件不能用肉眼或用上面描述的string来指定。 其中最主要的就是那些你想在两个视图之间build立一个恒定(但是不平等)的关系,就像你的顶部和底部的布局一样。 你希望其中的一个占据40%的可用垂直空间,另一个占60%。 这样做使用的方法: +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:] 。 例如:

 NSLayoutConstraint *c = [NSLayoutConstraint constraintWithItem:bottomView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:topView multiplier:1.5 constant:0]; 

这给你一个约束,将bottomView的高度设置为bottomView的1.5倍(这是你想要的,因为60/40 = 1.5)。

如果以编程方式创build约束,则可以在创build(或加载)视图层次结构时将它们添加到适当的视图中。 你的视图控制器的-viewDidLoad方法是一个很好的地方。

我不知道如何使用autolayout,因为我不使用它,但是在没有它的代码中,可以创build两个UIViews并将它们的框架设置为:

 CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height * 0.4f); CGRectMake(0, self.view.frame.size.height * 0.4f, self.view.frame.size.width, self.view.frame.size.width * 0.6f); 

然后在顶视图中,您可以添加带有框架的button(假设视图被称为view1 ):

 CGRectmake(0, 0, self.view.frame.size.width, view1.frame.size.height * (1.0f/3.0f)); CGRectmake(0, view1.frame.size.height * (1.0f/3.0f), self.view.frame.size.width, view1.frame.size.height * (1.0f/3.0f)); CGRectmake(0, view1.frame.size.height * (2.0f/3.0f), self.view.frame.size.width, view1.frame.size.height * (1.0f/3.0f)); 

你需要添加一些约束来使其工作。 所以这里简要说明你需要什么:

  1. 您将需要水平间距约束。 一个如果是顶视图,因为它与顶部的距离为零。 另一个是底视图,因为它到底部的距离是零。 两种观点之间还有一个约束,因为它们之间也有零距离。

  2. 顶视图中的button也会应用相同的原则。 把正确大小的button放在顶部视图中,并添加类似的约束,但现在你有三个元素(而不是两个)。 所以对顶部,底部和button之间的零间距进行限制。

当你添加组件到你的视图时,它会为你创build一些限制。 在底部添加一个顶部和另一个,它将创build顶部的间距和彼此之间的间距。 要编辑它们,只需去检查员,第五个标签(标尺),你会看到约束列表。 最后,你可能想尝试约束菜单(我不知道这是否有一个众所周知的名称)。 它位于Interface Buildercanvas的右下angular。 看到图像:

在这里输入图像说明

请让我知道你是否需要进一步的帮助。

这可以使用故事板时自动完成(你可能需要改变一个或两个设置)。 当您创buildGUI时,可以在屏幕尺寸(3.5和4英寸)之间切换,以确保它们在两个屏幕上都看起来不错。 看到这个问题的答案 。

你也可以看到这个教程 。 这应该给你一个关于如何使用GUI布局的想法。