Создание UILabel программно с ограничениями?

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

Я рассматривал возможность использования:

CGRect(x:, y:, width:, height:)

Тем не менее, если я использую это, мне нужно будет задать заданную ширину, поэтому я не думаю, что это сработает.

Я также пытался использовать:

CGPoint(x:, y:)

Затем установка ведущих, конечных и привязок высоты, однако, похоже, это тоже не работает, поскольку, хотя он и компилируется, я получаю сообщение об ошибке, когда пытаюсь создать новый UILabel.

Я новичок в программировании на Swift, поэтому я не уверен, есть ли для этого очевидное решение.

проверить stackoverflow.com/a/40299281/6783598

Ben Rockey 30.05.2019 12:56
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
4 380
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать следующий код для создания UILabel программно.

private let label: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.numberOfLines = 0
    label.text = "Hello World"
    return label
}()

Затем внутри вашего viewDidLoad()

addSubview(label)
NSLayoutConstraint.activate([
    topAnchor.constraint(equalTo: label.topAnchor),
    bottomAnchor.constraint(equalTo: label.bottomAnchor),
    leadingAnchor.constraint(equalTo: label.leadingAnchor),
    trailingAnchor.constraint(equalTo: label.trailingAnchor)
])

Почему вторая часть должна быть в viewDidLoad? Могу ли я иметь вторую часть (ограничения) в той же функции, в которой я создаю метку (при условии, что я создаю метку внутри функции)?

Ken 30.05.2019 15:14
Ответ принят как подходящий

Как вы сказали, у нас уже есть x, y and height для label, т.е.

let x: CGFloat = 0
let y: CGFloat = 0
let height: CGFloat = 50

Давайте создадим label, используя приведенные выше детали. Также установите width из label как UIScreen.main.bounds.width в соответствии с вашими требованиями.

let label = UILabel(frame: CGRect(x: x, y: y, width: UIScreen.main.bounds.width, height: height))
label.text = "This is a sample text"

Не забудьте установить label'stranslatesAutoresizingMaskIntoConstraints как false и добавить к чему угодно subview.

label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)

Добавьте соответствующий constraints из label с его superview - top, bottom, leading, height. Вы можете определенно добавить bottom constraint, если это необходимо. Это полностью зависит от вашего пользовательского интерфейса.

Я добавляю label к top of the viewController's view.

NSLayoutConstraint.activate([
    label.heightAnchor.constraint(equalToConstant: height),
    view.topAnchor.constraint(equalTo: label.topAnchor),
    view.leadingAnchor.constraint(equalTo: label.leadingAnchor),
    view.trailingAnchor.constraint(equalTo: label.trailingAnchor)
    ])

Нужно ли добавлять ограничение по высоте, даже если я уже установил высоту в CGRect()? Кроме того, лучше ли установить ограничение просмотра, равное метке, или метку, равную просмотру?

Ken 30.05.2019 14:12

Если у вас есть рост, вы, конечно, можете.

PGDev 30.05.2019 14:23

По какой-то причине строка «label.translatesAutoresizingMaskIntoConstraints = false» вызывает у меня проблемы (изменение позиции y на 0). Когда я его комментирую, метка находится в правильном положении, но при ее использовании метка находится в самом верху.

Ken 30.05.2019 15:01

Какие ограничения вы использовали? label.translatesAutoresizingMaskIntoConstraints должно быть false, если вы используете autolayout, иначе это может привести к неожиданным результатам.

PGDev 30.05.2019 15:03

Я добавил ограничения, которые вы предложили, но для начальных и конечных привязок переключился так, чтобы (например) label.leadingAnchor.constraint(equalTo: view.leadingAnchor). У меня также есть много других ограничений в автоматическом макете, но для разных вещей (например, кнопок и т. д.), которые вообще не связаны с метками.

Ken 30.05.2019 15:10

@Ken Кстати, я думаю, вам не нужно указывать высоту для метки. Потому что UILabel уже имеет внутренний размер содержимого, который будет размером текста, который он содержит, с использованием любого шрифта, который вы настроили для использования.

atalayasa 30.05.2019 15:51

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