Авторазмер 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)
}
Другие вопросы по тегам