Что я хочу сделать, так это создать новый UILabel программно каждый раз, когда в моем коде происходит определенное действие. Я знаю x, y и высоту, которые я хочу присвоить метке, но я не хочу присваивать ей заданную ширину. Я хочу ограничить стороны, чтобы ширина UILabel была равна ширине экрана, и чтобы ширина метки менялась при изменении ориентации.
Я рассматривал возможность использования:
CGRect(x:, y:, width:, height:)
Тем не менее, если я использую это, мне нужно будет задать заданную ширину, поэтому я не думаю, что это сработает.
Я также пытался использовать:
CGPoint(x:, y:)
Затем установка ведущих, конечных и привязок высоты, однако, похоже, это тоже не работает, поскольку, хотя он и компилируется, я получаю сообщение об ошибке, когда пытаюсь создать новый UILabel.
Я новичок в программировании на Swift, поэтому я не уверен, есть ли для этого очевидное решение.
Вы можете использовать следующий код для создания 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? Могу ли я иметь вторую часть (ограничения) в той же функции, в которой я создаю метку (при условии, что я создаю метку внутри функции)?
Как вы сказали, у нас уже есть 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's
translatesAutoresizingMaskIntoConstraints
как 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()? Кроме того, лучше ли установить ограничение просмотра, равное метке, или метку, равную просмотру?
Если у вас есть рост, вы, конечно, можете.
По какой-то причине строка «label.translatesAutoresizingMaskIntoConstraints = false» вызывает у меня проблемы (изменение позиции y на 0). Когда я его комментирую, метка находится в правильном положении, но при ее использовании метка находится в самом верху.
Какие ограничения вы использовали? label.translatesAutoresizingMaskIntoConstraints
должно быть false
, если вы используете autolayout
, иначе это может привести к неожиданным результатам.
Я добавил ограничения, которые вы предложили, но для начальных и конечных привязок переключился так, чтобы (например) label.leadingAnchor.constraint(equalTo: view.leadingAnchor). У меня также есть много других ограничений в автоматическом макете, но для разных вещей (например, кнопок и т. д.), которые вообще не связаны с метками.
@Ken Кстати, я думаю, вам не нужно указывать высоту для метки. Потому что UILabel уже имеет внутренний размер содержимого, который будет размером текста, который он содержит, с использованием любого шрифта, который вы настроили для использования.
проверить stackoverflow.com/a/40299281/6783598