UIStackView - скрыть и свернуть подпредставление с анимацией - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь скрыть подпредставление UIStackView так:

UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 2.0, 
      delay: 0, options: [.curveEaseOut], animations: {
    self.label.isHidden = true
    self.label.alpha = 0.0
    self.stackView.layoutIfNeeded()
})

Однако при использовании этого кода метка исчезает мгновенно. Я подозреваю, что это из-за установки isHidden в значение true, которое требуется для свертывания.

Есть ли способ, как спрятать и свернуть subvew UIStackView с анимацией? Или, может быть, лучше вообще не использовать UIStackView?

Ответы [ 5 ]

0 голосов
/ 11 января 2019

Согласно документации Apple :

Вы можете анимировать как изменения свойства isHidden упорядоченного подпредставления, так и изменения свойств представления стека, поместив эти изменения в блок анимации.

Я протестировал приведенный ниже код с помощью симулятора iOS 12.1, и он работает, как и ожидалось.

UIView.animate(
    withDuration: 2.0,
    delay: 0.0,
    options: [.curveEaseOut],
    animations: {
        self.label.isHidden = true
        self.label.alpha = 0.0
})

Arranged Subview Animation Gif

0 голосов
/ 09 января 2019

Просто вы можете использовать простое решение с animateKeyframes для затухания альфы, а затем спрятаться, я думаю, что это даст вам то, что вам нужно

// showLabel - это Bool для обработки статуса, объявить его у вас Файл

@IBAction func toggleStackLabelTapped(_ sender: UIButton) {

    showLabel = !showLabel

    UIView.animateKeyframes(withDuration: 1, delay: 0, options: .calculationModeLinear, animations: {
        UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.8) {
            self.label.alpha =  (self.showLabel) ? 1 : 0
        }
        UIView.addKeyframe(withRelativeStartTime: 0.8, relativeDuration: 1) {
            self.label.isHidden = !self.showLabel
        }

    })
}
0 голосов
/ 08 января 2019

убедитесь, что вы не задали ограничение высоты для стека. и попробуй это.

UIView.animate(withDuration: 0.5) {
   self.stackView.subviews[INDEX_OF_LABEL_IN_STACK]?.alpha = 0
   self.stackView.subviews[INDEX_OF_LABEL_IN_STACK]?.isHidden = true
   self.view.layoutSubviews()
}
0 голосов
/ 09 января 2019

Я попробовал твой код. Его анимация

if self.stackView.subviews.count > 0 {
            UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 1.0, delay: 0, options: [.curveEaseOut], animations: {

                self.stackView.subviews[0].isHidden = true
                self.stackView.subviews[0].alpha = 0.0
                self.stackView.layoutIfNeeded()
            }) { (position) in
                self.stackView.subviews[0].removeFromSuperview()
            }
        }

initialScreen

animated

0 голосов
/ 05 января 2019

Вы можете анимировать свойства просмотра, такие как alpha, color и т. Д. Однако некоторые вещи происходят мгновенно - isHidden в этом случае.

Вот пример использования UIView.animate:

UIView.animate(withDuration: 2, delay: 0, options: .curveEaseOut, animations: {
    self.label.alpha = 0 // Changes the label's layer alpha value
}, completion: { finished in
    self.label.isHidden = true // Hides the label
    self.label.layer.alpha = 1 // Resets the label's alpha without un-hiding it
})

Использование UIViewPropertyAnimator:

UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 2, delay: 0, options: .curveEaseOut, animations: {
    self.label.alpha = 0 // Sets the label's alpha
}) { _ in
    self.label.isHidden = true // Hides the label
    self.label.alpha = 1 // Resets the label's alpha without un-hiding it
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...