【发布时间】:2019-01-06 09:58:22
【问题描述】:
我希望我的视图具有以下属性(数字是任意选择的):
- 宽度等于高度除以 1.2
- 停留在屏幕右下方
- 纵向时高度为屏幕高度的 1/7
- 方向改变时宽度和高度不会改变
前三个要求可以很容易地翻译成UILayoutConstraints。我用 SnapKit 完成它们只是因为它读起来更清楚。即使您以前从未使用过 SnapKit,您也应该明白我的意思。
let myView = UIView(frame: .zero)
myView.backgroundColor = .green
view.addSubview(myView)
myView.snp.makeConstraints { (make) in
make.right.equalToSuperview().offset(-8)
make.bottom.equalToSuperview().offset(-8)
make.width.equalTo(myView.snp.height).dividedBy(1.2)
make.height.equalTo(view.snp.height).dividedBy(7) // *
}
问题是最后一个要点。当我将设备从纵向旋转到横向时,原来旋转前的宽度变成了旋转后的高度。这导致我的视野因此变小。
基本上,我想用类似这样的东西替换标有* 的约束:
make.height.equalTo(max(view.snp.height, view.snp.width)).dividedBy(7)
但我不认为 max(a, b) 是 SnapKit 或 UILayoutConstraint API 中的东西。
肯定还有其他表达“等于哪个长度更长”的方式,对吧?
附:我没有用snapkit 标记它,因为我也会接受使用UILayoutConstraint API 的答案。
【问题讨论】:
-
仅限 iPhone 还是 iPad 和 iPhone?我问的原因是 iPad 在两个方向上都有相同的尺寸等级,所以你必须做一些额外的工作,但你的问题的简短回答是使用尺寸等级
-
@Paulw11 iPhone 和 iPad。
-
@Paulw11 你的意思是我应该检测尺寸等级何时更改为
viewWillTransition(to:with:),并根据新的尺寸等级调用snp.remakeConstraints? -
是的,您可以同时设置两个约束,然后在尺寸等级更改时根据需要激活/停用。这样,您可以在旋转旁边为约束激活设置动画
-
由于 iPad 在两个方向都有相同的尺寸等级,您需要使用 this technique 覆盖尺寸等级
标签: snapkit ios swift autolayout