这是一个非常直接的问题,但我们花了很多时间试图找到一个有效的解决方案,但是它已经失败了。
在Xcode,storyboard中,如何设置一个约束,以便一个视图可以位于超级视图顶部总窗口的30%高度?对于所有支持的iOS设备,我们都需要它。
请参阅附上的插图。
答案 0 :(得分:12)
答案 1 :(得分:8)
抱歉,我误解了你的问题。
您需要从代码中添加约束(@IBOutlet weak var imageView: UIImageView!
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let yConstraint = NSLayoutConstraint(item: imageView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: view.bounds.height / 3)
let xConstraint = NSLayoutConstraint(item: imageView, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1, constant: 30)
NSLayoutConstraint.activateConstraints([yConstraint, xConstraint])
}
完全是任意的,但您必须定义x,y位置,宽度和高度,以获得明确的布局):
imageView.top = 1 * view.top + (view.width / 3)
这样,等式将是:
aView.property = Multiplier * bView.property + Constant
自动布局使用以下等式进行约束:
view.height = 0.3 * superView.height + 0
基于此,您可以简单地添加相等的宽度/高度约束,然后添加乘数:
所以等式将是:
parts
答案 2 :(得分:2)
你应该计算它。
1。计算从顶部到中心ImageView
的百分比2. 将垂直中心设置为ImageView
3。在垂直中心约束中配置乘数并从 1
设置乘数例如:乘数0.5从顶部到中心ImageView将是25%。所以你的乘数将是~0.6
顺便说一下,还有另外一种方法:
1。从顶部到imageView创建透明视图
2. 设置高度等于您的子视图
3. 将倍数设置为此高度约束
4. 将imageView的底部空间设置为此透明视图等于零
答案 3 :(得分:1)
为避免每次layoutSubviews
之后都必须重新计算常数,请使用UILayoutGuide
。
创建一个等于视图高度30%的布局指南,然后使用该指南对齐子视图的顶部。无需手动进行布局计算。
// Create a layout guide aligned with the top edge of the parent, with a height equal to 30% of the parent
let verticalGuide = UILayoutGuide()
parent.addLayoutGuide(verticalGuide)
verticalGuide.topAnchor.constraint(equalTo: parent.topAnchor).isActive = true
verticalGuide.heightAnchor.constraint(equalTo: parent.heightAnchor, multiplier: 0.3).isActive = true
// Align the top of the child to the bottom of the guide
child.topAnchor.constraint(equalTo: verticalGuide.bottomAnchor).isActive = true
UILayoutGuide
的布局可以像任何视图一样受到约束,但不会出现在视图层次结构中。
答案 4 :(得分:0)
在Equal Heights Constraint
属性窗格中,您将乘数设置为“1:3”(即除法符号为30%)。