Действительно простой способ сделать это - поместить метки (одну, две или три) в центрированный UIStackView. Вам все равно нужно знать желаемую фиксированную ширину метки и применять ограничение ширины к каждой метке, но все остальное просто позаботится о себе.
В качестве демонстрации я использовал произвольную ширину 100, а текст для всех трех меток был просто "UILabel", как на вашем изображении. Вот как это выглядит с одной этикеткой:
Вот как это выглядит с тремя метками:
Вот код, который я использовал (sv
- это вид стека, который уже настроен в раскадровке; n
- это количество меток, которое мы хотим):
for _ in 1...n {
let lab = UILabel()
lab.text = "UILabel"
lab.textAlignment = .center
lab.translatesAutoresizingMaskIntoConstraints = false
lab.widthAnchor.constraint(equalToConstant: 100).isActive = true
sv.addArrangedSubview(lab)
}
Так что все, что вам действительно нужно сделать, это получить правильный текст из вашего массива, пока мы выполняем цикл, и все готово. Дело в том, что вам вообще не нужно думать о кадрах! UIStackView навязывает нам правильные кадры.
ПРИМЕЧАНИЕ Хотя я сказал выше, что представление стека «настроено в раскадровке», это не имеет никакого отношения к ответу. Вы также можете создавать и настраивать представление стека в коде, не меняя ничего относительно моего ответа. Дело в том, что представление стека уже знает , как получить произвольное количество представлений, распределить их равномерно и центрировать их как единое целое. Вот для чего это. Так что, если, как показывает ваш вопрос, вы не можете управлять арифметикой, чтобы назначить представления фрейму самостоятельно, почему бы не позволить стековому представлению сделать это за вас?