У меня есть массив, который составляет от 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)
}
}
2 ответа
Вы можете использовать режим просмотра стека, предложенный @matt. Если вы не хотите использовать 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)
}
}
Действительно простой способ сделать это - поместить метки (одну, две или три) в центрированный 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 навязывает нам правильные кадры.
ПРИМЕЧАНИЕ . Хотя я уже говорил выше, что представление стека «настроено в раскадровке», это никак не связано с ответом. Вы также можете создавать и настраивать представление стека в коде, не меняя ничего в моем ответе. Дело в том, что стековое представление уже знает , как получить произвольное количество представлений, распределить их равномерно и центрировать их в целом. Вот для чего это. Так что, если, как показывает ваш вопрос, вы не можете управлять арифметикой, чтобы назначить представления фрейму самостоятельно, почему бы не позволить стековому представлению сделать это за вас?
Новые вопросы
swift
Swift - это безопасный, быстрый и выразительный язык программирования общего назначения, разработанный Apple Inc. для своих платформ и Linux. Swift с открытым исходным кодом. Используйте тег только для вопросов о языковых функциях или необходимости кода в Swift. Используйте теги [ios], [ipados], [macos], [watch-os], [tvos], [cocoa-touch] и [cocoa] для (не зависящих от языка) вопросов о платформах или фреймворках.