Является ли layoutMarginsGuide чрезмерным? - PullRequest
0 голосов
/ 07 мая 2018

Когда я пытался создать ограничения макета, я читал о классе NSLayoutAnchor. Они сказали:

Примечание

UIView не предоставляет свойства привязки для поля макета атрибутов. Вместо этого свойство layoutMarginsGuide предоставляет UILayoutGuide объект, который представляет эти поля. Используйте руководство свойства привязки для создания ваших ограничений

Ok. Но одновременно я создал свойства привязки для свойств полей макета без свойства UILayoutGuide.

     let inputsContainerView = UIView()
    inputsContainerView.backgroundColor = UIColor.white
    inputsContainerView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(inputsContainerView)

    //need x,y,width,height constraints
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -24).isActive = true
    inputsContainerView.heightAnchor.constraint(equalToConstant: 150).isActive = true

Так зачем нам нужен объект UILayoutGuide? И получается, что UIView предоставляет свойства привязки для атрибутов полей макета? Пожалуйста, если кто-нибудь знает что-нибудь, я был бы очень признателен.

1 Ответ

0 голосов
/ 03 июня 2018

Это зависит от ваших требований к дизайну.

layoutMarginsGuide состояния документации :

Руководство по макету, представляющее поля представления. Используйте привязки этого руководства по компоновке для создания ограничений с полем представления.

Там, где поля макета - это просто безопасная область вида:

Безопасные области помогут вам разместить ваши представления в видимой части общего интерфейса. Определенные UIKit контроллеры представления могут размещать специальные представления поверх вашего контента. Например, контроллер навигации отображает панель навигации поверх содержимого основного контроллера представления. Даже если такие представления частично прозрачны, они все равно закрывают содержимое, которое находится под ними.

Для self.view видимая часть общего интерфейса будет исключать области, занятые строкой состояния, панелью навигации, панелью вкладок и т. Д.
Для обычного UIView заполнение по умолчанию составляет 8px.

Таким образом, если вы хотите, чтобы someView был ограничен в пределах безопасной области / поля otherView, тогда вы будете ссылаться на otherView s layoutMarginsGuide якоря.
Если нет, то достаточно otherView якорей.

1. Пример (с layoutMarginsGuide):

let textField = UILabel()
textField.text = "Using Layout Margins Guide Anchors"
textField.backgroundColor = UIColor.red
textField.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(textField)

var constraints = [NSLayoutConstraint]()
//textfield's top edge = self.view's margin's top edge
constraints.append(textField.topAnchor.constraint(equalTo: self.view.layoutMarginsGuide.topAnchor))

//textfield's leading edge = self.view's margin's leading edge
constraints.append(textField.leadingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.leadingAnchor))

//textfield's trailing edge = self.view's margin's trailing edge
constraints.append(textField.trailingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.trailingAnchor))

//Apply the constraints
NSLayoutConstraint.activate(constraints)

Выход:

On layoutMarginsGuide

Замечание:

  • Листья 20px от левого / правого края self.view
  • Начинается сразу под строкой состояния
    • Если бы у вас была навигационная панель, то она начиналась бы ниже этого
  • Это self.view безопасная область / поля макета

2. Пример (без layoutMarginsGuide):

let textField = UILabel()
textField.text = "Without Layout Margins Guide Anchors"
textField.backgroundColor = UIColor.red
textField.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(textField)

var constraints = [NSLayoutConstraint]()
//textfield's top edge = self.view's top edge
constraints.append(textField.topAnchor.constraint(equalTo: self.view.topAnchor))

//textfield's leading edge = self.view's leading edge
constraints.append(textField.leadingAnchor.constraint(equalTo: self.view.leadingAnchor))

//textfield's trailing edge = self.view's trailing edge
constraints.append(textField.trailingAnchor.constraint(equalTo: self.view.trailingAnchor))

//Apply the constraints
NSLayoutConstraint.activate(constraints)

Выход: On View Anchors alone

Замечание:

  • Начинается сразу с левого / правого края self.view
  • Начинается сразу с верхнего края self.view, который перекрывает строку состояния
    • Если бы была навигационная панель, она бы тоже перекрывалась
  • Это границы self.view

Наконец, это зависит от вашего требования.
Иногда вы должны использовать его, иногда вы могли бы использовать его, иногда вам просто не нужно его использовать.

PS: Теперь, независимо от того, используете ли вы его на якорях UIView или на якорях layoutMarginsGuide, он будет реагировать на поворот устройства или любые другие изменения макета автоматически.

...