使垂直间距约束恒定等于屏幕高度的百分比

5
我希望在两个子视图之间的垂直间距约为屏幕高度的百分比,以便在所有设备上设计看起来大致相同。请问如何在Storyboard中实现?是否有任何已知的技巧可以做到这一点?
或许可以通过内容紧缩优先级、压缩阻力或次要优先级的第二个约束来实现这一点?请参考以下链接中的图片进行操作:enter image description here
4个回答

2
我想到的解决方案是在我的两个子视图之间引入第三个子视图,并在该第三个子视图与父视图上设置一个宽高比约束。这两个子视图将与第三个子视图具有零距离约束。
然而,我不喜欢在故意隐藏的子视图中弄乱故事板。

2
这是正确的做法。如果你想避免无形的子视图,你也可以添加一个UILayoutGuide而不是第三个子视图,但你必须在代码中添加它。 - dan
1
如果那真的是正确答案 - 我不能说我对苹果的Autolayout有多少尊重。 - etayluz
故事板中的自动布局只能做到这么多。有时候你需要代码。代码没有任何问题。 - Hayden Holligan
自动布局和故事板的出现本意是为了让我们不必编写代码 - 如果它们不能胜任自己的工作,那就太糟糕了。毫无疑问,调整大小掩码和CGRectMake的日子将永存! - etayluz

2

创建一个垂直空间约束的IBOutlet。然后检查设备使用的屏幕尺寸,将值分配给您的约束常量。例如:

if(screenSize.height == 480)
{
  self.verticalspaceConstraints.constant = 100 ;//this is an example
}

//like this add your other conditions

我已经创建了一个小视频教程,用于了解基本概念,请试试这个小视频教程。希望对你有所帮助。

我该如何在Storyboard中实现这个?请不要提供代码解决方案。无意冒犯,但那也是一个丑陋的解决方案。谢谢。 - etayluz
只需在.h文件中“拖动”并创建一个“outlet”到您的“约束”,然后根据您的条件更改其值。 - caldera.sac

0

为了在两个视图之间具有适应性的垂直间距,您可以:

  • 使用UIStackview并动态定义间距
  • 在两者之间使用垂直间距约束,并将优先级更改为250。您需要在第一个上设置顶部约束,在第二个上设置底部约束。 Change prority value
  • 在每个子视图和父视图之间使用等高关系。您可以在每个子视图上设置“比例高度”,例如0.4,这样可以让它们之间保持20%的边距。要这样做,请在子视图上按CTRL +单击,然后将线条绘制到父视图上。

Create height constraint relation

然后调整“multiplier”,确保第一个元素是子视图。

Change multiplier value


0

我有两个解决方案,但是我正在使用第一个。

1)在两个元素之间放置一个UIView,并将间隙视图作为控制器的主视图的比例高度。这样它会根据设备增加,但这个想法可能感觉复杂。因为要设计一个复杂的屏幕,你将不得不放很多间隙视图,这会很混乱。

2)在设计时标记约束为动态约束,通过给约束的标识符属性分配一些字符来实现。创建一个NSLayoutConstraint类别类,在类中继承其函数并检查标识符是否以该字符开头,并修改值,如乘以设备缩放比。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接