UIStackView Сокрытие / скрытие упорядоченной проблемы SubView - PullRequest
0 голосов
/ 19 мая 2018

Я скрываю и скрываю dropDownView (UIView, состоящий из текстового поля и кнопки), основанный на сегменте, повернутом в элементе управления сегментом.Ниже приведена иерархия представлений: -

enter image description here

Ниже приведен код, который скрывает / отображает dropDownView: -

 private func animateView(view: UIStackView, toHidden hidden: Bool) {
    UIView.animate(withDuration: 0.25) 
    {
    let firstView = view.arrangedSubviews[0]
    firstView.isHidden = hidden
    }
    }
func segmentValueChanged(_ sender: UISegmentedControl) {
        let segmentSelected = segmentControl.selectedSegmentIndex
        switch segmentSelected {
        case 0:
            animateView(view: mainStackView, toHidden: true)
        case 1:
         animateView(view: mainStackView, toHidden: true)
        case 2:
            animateView(view: mainStackView, toHidden: true)
        case 3:
           animateView(view: mainStackView, toHidden: false)
        default:
            break
        }
    }

Проблема, котораяЯ сталкиваюсь с тем, что после изменения сегментов более 10-15 раз вышеуказанный код перестает работать, и представление DropDown пересекается с управлением сегментами, и я не уверен, почему.Любая помощь, чтобы понять эту проблему приветствуется.

Также я уже пробовал 1.setNeedsLayout,2. setNeedsDisplay и3. уменьшение приоритета для ограничения высоты dropDownView до 999 с 1000

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Попробуйте это ниже.Надежда решит вашу проблему.

private func animateView(view: UIStackView, toHidden hidden: Bool) {
    let firstView = view.arrangedSubviews[0]
    UIView.animate(withDuration: 0.25) {
        firstView.isHidden = hidden
        view.layoutIfNeeded()
    }
}
0 голосов
/ 20 мая 2018

Ниже приведено решение, которое я реализовал и которое работает: -

private func animateView(view: UIStackView, toHidden hidden: Bool) {
        if !hidden
        {
          mainStackView.insertArrangedSubview(view, at: 0)
          view.isHidden = true
          UIView.animate(withDuration: 0.25, animations: {
            view.isHidden = false
          })
        } else {
            let firstView = mainStackView.arrangedSubviews[0]
            UIView.animate(withDuration: 0.25, animations: {
                if firstView == view {
                    firstView.isHidden = true
                }
            }, completion: { [weak self] _ in
                if firstView == view {
                    self?.mainStackView.removeArrangedSubview(firstView)
                    firstView.removeFromSuperview()
                }
            })
        }
    }

Создание представления DropDown программно (вместо создания в раскадровке) и удаление его при каждом завершении.Я не отмечаю этот ответ как правильный обходной путь.Я хочу понять, почему раскадровка dropDownView дает сбой после 10-15 попыток.

0 голосов
/ 19 мая 2018

Попробуйте без вашей функции анимации, так как stackView должен анимировать скрытие и отображение в любом случае.Добавьте проверку на скрытый статус и меняйте ее только при необходимости:

func segmentValueChanged(_ sender: UISegmentedControl) {
    let segmentSelected = segmentControl.selectedSegmentIndex
    let dropDown = mainStackView.arrangedSubviews.first!

    switch segmentSelected {
        case 0, 1, 2:
            if !dropDown.isHidden {
                dropDown.isHidden = true
            }
        case 3:
            if dropDown.isHidden {
                dropDown.isHidden = false
            }
        default:
            break
    }

}
...