Swift — Как установить интервал между переменным количеством кнопок в горизонтальном стекировании?

#swift #autolayout #nslayoutconstraint #uistackview

#swift #автозапуск #nslayoutconstraint #uistackview

Вопрос:

Я использую горизонталь UIStackView , которая может содержать до 3 UIButton секунд. (может быть только 1, может быть 2 или 3)

Я хочу, чтобы они были центрированы с одинаковым промежутком между каждым из них, вот так: введите описание изображения здесь

Кажется, я не могу это сделать… Я перепробовал все комбинации Distribution и Alignment , но не могу сделать это правильно.

Вот stackView ограничения:

 fileprivate func setupStackViewConstraints() {
    stackView.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        stackView.topAnchor.constraint(equalToConstant: 60),
        stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
        stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
        stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
    ])
}
  

И вот ограничения кнопок:

 fileprivate func setupFacebookButton() {
    let facebookButton = UIButton()
    
    facebookButton.setImage(UIImage(named: "facebookSocialIcon"), for: .normal)
    facebookButton.imageView?.contentMode = .scaleAspectFit
    facebookButton.addTarget(self, action: #selector(facebookButtonWasTapped), for: .touchUpInside)
    
    // -----------------------------------
    
    facebookButton.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        facebookButton.widthAnchor.constraint(equalToConstant: 40),
        facebookButton.heightAnchor.constraint(equalToConstant: 40)
    ])
    
    // -----------------------------------
    
    stackView.addArrangedSubview(facebookButton)
}
  

Есть идеи?

Ответ №1:

Распределение и выравнивание здесь очевидны. Вы хотите «Равный интервал» и «По центру». Вы также должны установить подходящий spacing .

«Сложный момент» заключается в том, как заставить упорядоченные представления выравниваться по горизонтали посередине, поскольку alignment свойство касается только выравнивания перпендикулярно axis .

Ключ в том, чтобы позволить стековому представлению иметь гибкую ширину и выровнять его по горизонтали по центру. Это означает удаление начальных и конечных ограничений и добавление ограничения center X.

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

 NSLayoutConstraint.activate([
    stackView.topAnchor.constraint(equalToConstant: 60),
    stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
])
  

Обратите внимание, что представление стека увеличит свою ширину, чтобы вместить все упорядоченные подвиды в нем. Это означает, что если у вас слишком много упорядоченных вложенных представлений, некоторые из них могут пропасть за кадром. Если вы хотите, чтобы они «переносились» на следующую строку, рассмотрите возможность использования a UICollectionView вместо этого 🙂

Ответ №2:

Попробуйте ограничить свой StackView только по центру x и y (не ограничивая его начальные и конечные привязки):

 NSLayoutConstraint.activate([
    stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])
  

И затем вы можете оставить значение распределения по умолчанию и установить значение интервала на то, что вы хотите:

 stackView.spacing = // 16px
  

Таким образом, ширина стека будет равна ширине содержимого.