Автомакет UITextField с полями программно

Я новичок в AutoLayout и хотел бы отображать свой UITextField с шириной 100% с постоянным левым и правым полем в 15 пикселей, например:

введите здесь описание изображения

Обычно я делаю это с помощью CGRect, устанавливая ширину равной ширине содержащего представления минус 30 пикселей, а затем смещаю левую сторону на 15 пикселей:

searchTextField.frame = CGRectMake(15, 0, view.frame.width - 30, 50)

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

Я был бы рад, если бы кто-нибудь мог мне помочь!

Обновить

Ух ты! Спасибо за все ответы. Я верю, что все они добьются того, что я пытаюсь сделать, но может быть только один :)


person Jody Heavener    schedule 29.05.2016    source источник


Ответы (5)


Обычно я использую этот кокоапод, который имеет дело с ограничениями, но если вам нужна чистая документация по яблочному решению:

Когда дело доходит до программного создания ограничений, у вас есть три варианта: вы можете использовать привязки макета, вы можете использовать класс NSLayoutConstraint или вы можете использовать язык визуального формата.

Подход с NSLayoutConstraints в вашем случае будет:

NSLayoutConstraint(item: textField, attribute: .Leading, relatedBy: .Equal, toItem: parentView, attribute: .LeadingMargin, multiplier: 1.0, constant: 15.0).active = true

NSLayoutConstraint(item: textField, attribute: .Trailing, relatedBy: .Equal, toItem: parentView, attribute: .TrailingMargin, multiplier: 1.0, constant: -15.0).active = true

NSLayoutConstraint(item: textField, attribute: .Top, relatedBy: .Equal, toItem: parentView, attribute: .TopMargin, multiplier: 1.0, constant: 50.0).active = true

Помните, что если у вас нет никаких ограничений в представлении, они будут добавлены автоматически, и вам придется иметь дело с ними и конфликтами, которые могут возникнуть при добавлении новых ограничений во время выполнения. Чтобы избежать этого, вы можете либо создать textField вручную и добавить его в представление, либо установить ограничения с низким приоритетом в Interface Builder.

person Valdmer    schedule 29.05.2016

Предполагая, что родителем текстового поля является view, сделайте это после view.addSubview(searchTextField):

NSLayoutConstraint.activateConstraints([
    searchTextField.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor, constant: 15),
    searchTextField.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor, constant: -15),
    ])
person rob mayoff    schedule 29.05.2016
comment
Нравится это activateConstraints: - person Viktor Kucera; 06.09.2017

Используйте этот код:

let topConstraint = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Top, relatedBy: .Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0)

let trailingConstraint  = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Trailing, relatedBy: .Equal, toItem: self.view, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 15)

let leadingConstraint = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Leading, relatedBy: .Equal, toItem: self.view, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 15)

let heightConstraint = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Height, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 50)

self.view.addConstraint(topConstraint )
self.view.addConstraint(trailingConstraint)
self.view.addConstraint(leadingConstraint)
self.view.addConstraint(heightConstraint)
person Ashish Verma    schedule 29.05.2016

Установите ограничения в раскадровке.

Щелкните текстовое поле, затем щелкните кнопка булавки в левом нижнем углу. Оттуда вы можете выбрать такие ограничения.

person Adam H.    schedule 29.05.2016
comment
Плохо - я должен был указать, что пытаюсь сделать это без использования раскадровок. Все до сих пор было через код. - person Jody Heavener; 29.05.2016
comment
Ну, это, конечно, не выход. Однако, если это необходимо сделать в коде, вам нужно создать NSLayoutConstraint объекты и добавить их в родительское представление, если они имеют дело с интервалом между представлениями, или с самим текстовым полем, если оно указывает высоту или ширину. - person Adam H.; 29.05.2016

Чтобы использовать Auto Layout, вам нужно определить ограничения для вашего текстового поля. Здесь я создал четыре ограничения (Leading, Trailing, Top и Height), связанные с его супервизором.

func addLabelConstraints(superView:UIView) {

    let leading = NSLayoutConstraint(item: searchTextField, attribute: .Leading, relatedBy: .Equal, toItem: superView, attribute: .Leading, multiplier: 1, constant: 15)
    superview!.addConstraint(leading)

    let trailing = NSLayoutConstraint(item: searchTextField, attribute: .Trailing, relatedBy: .Equal, toItem: superView, attribute: .Trailing, multiplier: 1, constant: 15)
    superView.addConstraint(trailing)

    let top = NSLayoutConstraint(item: searchTextField, attribute: .Top, relatedBy: .Equal, toItem: superView, attribute: .Top, multiplier: 1, constant: 0)
    superView.addConstraint(top)

    let height = NSLayoutConstraint(item: searchTextField, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 0, constant: 50)
    superView.addConstraint(height)
 }
person ranjit.x.singh    schedule 29.05.2016