Как использовать фрейм для установки позиции x в цикле на Swift

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

Как использовать фрейм для установки позиции x в цикле на Swift

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
532
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Самый простой способ сделать это — поместить метки (одну, две или три из них) в центрированный 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 31.05.2019 01:57

Тот же ответ. Добавьте и настройте представление стека в коде. Иначе не вижу в чем проблема. Если вы действительно хотите рассчитать кадры вручную, вперед. Это простая арифметика.

matt 31.05.2019 02:01

На самом деле, у меня есть верстка всей программы с рамкой. Я хочу, чтобы компоновка была геометрической и математической. Некоторые циклы раздражают, но растворяются. Я просто хочу повысить уровень своего мастерства в такой аранжировке

amin 31.05.2019 17:28

@amin Это звучит как кошмар доступности, локализации и масштабируемости.

Alexander 02.06.2019 04:46
Ответ принят как подходящий

Вы можете использовать стек, как это было предложено @матовый. Если вы не хотите использовать 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 31.05.2019 16:58

@amin Я проверил свой ответ. Вы хотите, чтобы я загрузил скриншот?

arun siva 31.05.2019 17:23

Я проверял, метки находятся в левой части экрана.

amin 31.05.2019 17:33

@amin Я использовал var i:CGFloat = 0. У вас есть var i = -1. Вы изменили это?

arun siva 31.05.2019 18:18

Другие вопросы по теме