У меня есть массив, который варьируется от 1 до 3. Я хочу обрамить их посередине экрана на определенном расстоянии Также фиксирована ширина этикеток
let array = ["some1", "some2", "some3"]
func setLabel(){
var i = -1
for text in array{
i += 1
let label = UILabel()
label.fram = CGRect(x: screenWidth/2 - (CGFloat(i)*50) + 25, y: 100, width: 50 , height: 20)
label.text = text
addSubview(label)
}
}
Самый простой способ сделать это — поместить метки (одну, две или три из них) в центрированный 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 накладывает нам правильные кадры.
ПРИМЕЧАНИЕ Хотя я сказал выше, что представление стека было «настроено в раскадровке», это не имеет ничего общего с ответом. Вы также можете создать и настроить представление стека в коде, ничего не меняя в моем ответе. Дело в том, что представление стека уже знает как принимать произвольное количество представлений, равномерно распределять их и центрировать их как единое целое. Вот для чего это нужно. Итак, если, как следует из вашего вопроса, вы не можете справиться с арифметикой, чтобы назначить представления кадру самостоятельно, почему бы не позволить представлению стека сделать это за вас?
Тот же ответ. Добавьте и настройте представление стека в коде. Иначе не вижу в чем проблема. Если вы действительно хотите рассчитать кадры вручную, вперед. Это простая арифметика.
На самом деле, у меня есть верстка всей программы с рамкой. Я хочу, чтобы компоновка была геометрической и математической. Некоторые циклы раздражают, но растворяются. Я просто хочу повысить уровень своего мастерства в такой аранжировке
@amin Это звучит как кошмар доступности, локализации и масштабируемости.
Вы можете использовать стек, как это было предложено @матовый. Если вы не хотите использовать stackview, вы можете рассчитать позицию x по количеству массивов и индексу меток, как это
let array = ["some1", "some2", "some3"]
func setLabel(){
var i:CGFloat = 0
for text in array{
i += 1
let label = UILabel()
label.backgroundColor = .red
label.frame = CGRect(x: (view.bounds.width/CGFloat(array.count+1))*i-25, y: 100, width: 50 , height: 20)
label.text = text
view.addSubview(label)
}
}
Вы проверили свой ответ?
@amin Я проверил свой ответ. Вы хотите, чтобы я загрузил скриншот?
Я проверял, метки находятся в левой части экрана.
@amin Я использовал var i:CGFloat = 0
. У вас есть var i = -1
. Вы изменили это?
Я хочу сделать это с рамкой, я не использую раскадровку