Как использовать фрейм для установки положения x в цикле на Swift - PullRequest
0 голосов
/ 31 мая 2019

У меня есть массив, число которого варьируется от 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

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Вы можете использовать стек просмотра, как предложено @ 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 голос
/ 31 мая 2019

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


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

...