У меня есть UIView
на XIB, содержащий UIImageView
и UILabel
с небольшим пробелом между ними.Горизонтальный макет представляет собой простую цепочку |--image--label--|
, в которой --
- это некоторое фиксированное пространство.Высота установлена равной 40, это представление горизонтально центрировано в контроллере вида и имеет ограничение ширины >=
100.
Если я изменю текст метки, ширина моего составного представления обновится, как ожидаетсяwidth - измененная ширина его метки, и он остается точно по центру на контроллере вида.
Поскольку мне нужен UIView
, содержащий изображение и метку, в других местах я создал собственный класс, состоящий изфайла XIB и Swift.Давайте назовем это ItemView
.
У меня проблема в том, что пустой UIView
на моем контроллере представления XIB, класс которого я изменил на ItemView
, больше не принимает ограничение ширины >=
40,Это, конечно, потому что контроллер представления XIB больше не видит переменную ширину UILabel
, а вместо этого просто обычный UIView
класса ItemView
.Я получаю сообщение об ошибке «Неравенство с неоднозначностью».
В результате ширина моего пользовательского представления остается равной 40. Это работает немного, если я укажу большую> = ширину метки;тогда текст обрезается только при достижении этой ширины.Но во втором случае мой пользовательский вид больше не центрируется по горизонтали, а смещен немного влево.
Как мне решить эту проблему?Или, как я могу сказать IB, чтобы он обрабатывал мой пользовательский ItemView
так же, как UILabel
?
В моем ItemView
я сделал все, что мог найти:
override class var requiresConstraintBasedLayout: Bool
{
return true
}
Позвоните setNeedsLayout()
после установки текста метки.
Позвоните myLabel.translatesAutoresizingMaskIntoConstraints = false
.
Позвоните self.translatesAutoresizingMaskIntoConstraints = false
.
И позвоните self.setNeedsUpdateConstraints()
в обоих init()
s.