У меня есть массив, который составляет от 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)
  }
}

enter image description here

0
amin 31 Май 2019 в 02:00

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)
    }
}
1
arun siva 31 Май 2019 в 04:08

Действительно простой способ сделать это - поместить метки (одну, две или три) в центрированный UIStackView. Вам все равно нужно знать желаемую фиксированную ширину метки и применять ограничение ширины для каждой метки, но все остальное просто позаботится о себе.

В качестве демонстрации я использовал произвольную ширину 100, причем текст для всех трех меток был просто «UILabel», как на вашем изображении. Вот как это выглядит с одной этикеткой:

enter image description here

Вот как это выглядит с тремя метками:

enter image description here

Вот код, который я использовал (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 навязывает нам правильные кадры.


ПРИМЕЧАНИЕ . Хотя я уже говорил выше, что представление стека «настроено в раскадровке», это никак не связано с ответом. Вы также можете создавать и настраивать представление стека в коде, не меняя ничего в моем ответе. Дело в том, что стековое представление уже знает , как получить произвольное количество представлений, распределить их равномерно и центрировать их в целом. Вот для чего это. Так что, если, как показывает ваш вопрос, вы не можете управлять арифметикой, чтобы назначить представления фрейму самостоятельно, почему бы не позволить стековому представлению сделать это за вас?

1
matt 31 Май 2019 в 01:13
56386677