Авторазмер UILabel с SnapKit
Давайте предположим CustomView's
размер 300х300. iconImageView
имеет свой размер и назначенные ограничения. Я не знаю, как долго будет текст в UILabel
поэтому я не хочу делать постоянный размер UILabel
, Моя цель - прикрепить левое ограничение к правой стороне iconImageView
и право на customView
,
override func updateConstraints() {
super.updateConstraints()
iconImageView.snp.updateConstraints { (make) in
make.left.equalTo(customView).offset(10)
make.centerY.equalTo(customView)
make.size.equalTo(CGSize(width: 40.0, height: 40.0))
}
nameLabel.snp.updateConstraints { (make) in
make.right.equalTo(customView).offset(-10)
make.left.equalTo(iconImageView.snp.right).offset(10)
make.centerY.equalTo(customView)
}
}
Когда я пытаюсь этот метод, я получаю ошибку: Unable to simultaneously satisfy constraints.
Какой правильный способ сделать это?
1 ответ
Что ж, я предполагаю, что ваше подпредставление ничего не знает об ограничениях сверху / снизу, что означает, что представление не знает, как изменить структуру самого себя. Попробуй это:
override func updateConstraints() {
super.updateConstraints()
iconImageView.snp.updateConstraints { (make) in
make.left.equalTo(customView).offset(10)
make.centerY.equalTo(customView)
// Also from my point of view this line \/
// is not very readable
// make.size.equalTo(CGSize(width: 40.0, height: 40.0))
// Changed to:
make.width.height.equalTo(40.0)
}
nameLabel.snp.updateConstraints { (make) in
make.right.equalTo(customView).offset(-10)
make.left.equalTo(iconImageView.snp.right).offset(10)
// Add:
make.top.equalTo(customView.snp.top)
make.bottom.equalTo(customView.snp.bottom)
}
}
Если вы хотите сохранить высоту надписи "по умолчанию" (в случае пустых строк и т. Д.), Вы можете добавить:
make.height.greaterThanOrEqual(40.0)
Кроме того, autoLayout и кадры не работают хорошо друг с другом, поэтому вы должны расположить свой пользовательский вид в методе "updateConstraints", аналогично следующему:
customView.snp.updateConstraints { (make) in
make.edges.equalTo(self)
}