在故事板中:
- 将两个视图放在一个堆栈视图中
- 将堆栈视图设置为
- 轴:垂直
- 对齐:填充
- 分布:填充
- 间距:0(或任何您想要的间距)
- 给出堆栈视图:
- 顶部/底部/前导/尾随约束
- 或宽度、高度和位置限制
- 按住 Ctrl 键从底部视图拖动到顶部视图
- 选择等高,乘数为 1(没关系,因为它会在代码中更改)
在您的视图控制器中,为该约束创建一个@IBOutlet,例如:
@IBOutlet var proportionalHeightConstraint: NSLayoutConstraint!
它在 Storyboard 中的外观如下:
我们无法直接更改乘数,因此请将此扩展添加到您的项目中:
extension NSLayoutConstraint {
static func setMultiplier(_ multiplier: CGFloat, of constraint: inout NSLayoutConstraint) {
NSLayoutConstraint.deactivate([constraint])
let newConstraint = NSLayoutConstraint(item: constraint.firstItem as Any, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: constraint.secondItem, attribute: constraint.secondAttribute, multiplier: multiplier, constant: constraint.constant)
newConstraint.priority = constraint.priority
newConstraint.shouldBeArchived = constraint.shouldBeArchived
newConstraint.identifier = constraint.identifier
NSLayoutConstraint.activate([newConstraint])
constraint = newConstraint
}
}
在viewDidLoad()(或者当你得到你的两个值时):
class CubiaxViewController: UIViewController {
@IBOutlet var proportionalHeightConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
let top: CGFloat = 3600
let bottom: CGFloat = 2500
NSLayoutConstraint.setMultiplier(bottom / top, of: &proportionalHeightConstraint)
}
}
这是它在运行时的样子:
let top: CGFloat = 3600
let bottom: CGFloat = 2500
它的外观如下:
let top: CGFloat = 700
let bottom: CGFloat = 300
它的外观如下:
let top: CGFloat = 200
let bottom: CGFloat = 1500