Как вы обнаружили, в автоматическом макете сначала применяется множитель , а затем константа .
Из документов Apple:
Для достижения sh вашей цели вам нужно использовать другой вид или, что лучше, UILayoutGuide
.
Скажите автоматическому макету, что вы хотите, чтобы otherView / layoutGuide был viewWidth - 100
, а затем вы хотите, чтобы представление было этим значением * 0.5
.
Вот пример :
class SnapTestViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// create a view
let testView = UIView()
testView.backgroundColor = .orange
// create a Layout Guide
let vGuide = UILayoutGuide()
// add the layout guide to the testView
testView.addLayoutGuide(vGuide)
// constrain the layout guide
vGuide.snp.makeConstraints {
// to bottom-left corner
$0.leading.bottom.equalToSuperview()
// height doesn't really matter (it's not visible)
$0.height.equalTo(1)
// width = superView (testView) width - 100
$0.width.equalToSuperview().offset(-100)
}
// add testView to self.view
view.addSubview(testView)
// constrain testView
testView.snp.makeConstraints {
// 40-pts leading and trailing
$0.leading.trailing.equalToSuperview().inset(40)
// 100-pts from the top
$0.top.equalToSuperview().offset(100)
// height = layoutGuide height * 0.5
$0.height.equalTo(vGuide.snp.width).multipliedBy(0.5)
}
}
}