Удалить пользовательский интервал в UIStackView - PullRequest
3 голосов
/ 25 октября 2019

У меня есть вид в стеке с тремя подпредставлениями:

stackView.spacing = 8.0

stackView.addArrangeSubview(view1)
stackView.addArrangeSubview(view2)
stackView.addArrangeSubview(view3)

В какой-то момент я добавляю пользовательский интервал после view2:

stackView.setCustomSpacing(24.0, after: view2)

Теперь я хочу удалить пользовательский интервал. Возможно ли это с помощью UIStackView? Единственный способ, о котором я могу думать, это

stackView.setCustomSpacing(8.0, after: view2)

, но он сломается, если я когда-нибудь изменит интервал моего stackView на что-то отличное от 8.0, потому что интервал останется 8.0 после view2.

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Вы должны воссоздать stackView с определенным интервалом и заменить старое новым stackView.

0 голосов
/ 25 октября 2019

Попробуйте это расширение:

extension UIStackView {

    // remove all custom spacing
    func removeCustomSpacing() -> Void {
        let a = arrangedSubviews
        arrangedSubviews.forEach {
            $0.removeFromSuperview()
        }
        a.forEach {
            addArrangedSubview($0)
        }
    }

    // remove custom spacing after only a single view
    func removeCustomSpacing(after arrangedSubview: UIView) -> Void {
        guard let idx = arrangedSubviews.firstIndex(of: arrangedSubview) else { return }
        removeArrangedSubview(arrangedSubview)
        insertArrangedSubview(arrangedSubview, at: idx)
    }
}

Используйте его просто как:

myStackView.removeCustomSpacing()

или, если вы устанавливаете пользовательский интервал для нескольких видов, и хотите удалить его только изодин вид, используйте:

theStackView.removeCustomSpacing(after: view2)
0 голосов
/ 25 октября 2019
let spacingView = UIView()

[View1, View2, spacingView, View3].forEach { view in 
  stackView.addArrangeSubview(view)
}

, когда вы хотите удалить его, просто удалите spacingView из массива, и вы можете играть с шириной и высотой spacingView, как вы предпочитаете

...