Какой код соответствует ограничению визуального макета? - PullRequest
0 голосов
/ 25 мая 2019

Какой код соответствует ограничению визуального макета? Я хочу перевести его в формат NSLayoutConstraint.activate([]).

scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(scrollView)

view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))

stackView = UIStackView()
scrollView.addSubview(stackView)

scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[stackView]|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView]))
scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[stackView]", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView]))

Фрагмент из Простая прокрутка UIStackView .

1 Ответ

2 голосов
/ 25 мая 2019

Язык визуального формата (VFL) может создавать несколько ограничений одновременно, и это делает.Первые три VFL создают 2 ограничения каждое, а последнее создает одно ограничение.

Я бы предложил использовать якоря компоновки для создания ограничений.Вот эквивалент вашего кода с использованием NSLayoutConstraint.activate() и якорей макета:

scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(scrollView)

NSLayoutConstraint.activate([
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    scrollView.topAnchor.constraint(equalTo: view.topAnchor),
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])

stackView = UIStackView()
scrollView.addSubview(stackView)

NSLayoutConstraint.activate([
    stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
    stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
    stackView.topAnchor.constraint(equalTo: scrollView.topAnchor)
])

Примечания:

  1. Я исследовал эффекты .alignAllCenterX для результирующих ограничений, и этот параметр ничего не сделал в этом случае.
  2. Вы можете объединить все ограничения в один NSLayoutConstraint.activate() вызов , если вы добавите оба подпредставлений до создания ограничений.Я думаю, что это яснее с двумя вызовами, так как каждый набор имеет одну цель.
  3. NSLayoutConstraint.activate() умный, и он добавляет ограничения к соответствующим представлениям.Это предпочтительный вариант и доступен с iOS 8.
  4. Убедитесь, что вы установили stackView.translatesAutoresizingMaskIntoConstraints = false и stackView.axis = .vertical.(Вы, вероятно, просто оставили это вне вопроса, чтобы сделать его более кратким).
...