web-dev-qa-db-fra.com

Animation des sous-vues UIView isHidden

J'ai une UIView EmptyCollectionView, que j'affiche lorsque UICollectionView est vide. Voici comment je fonctionne: je crée UIView et addSubview dans viewDidLoad de mon ViewController, puis modifie la propriété de basculement isHidden de la vue (ainsi que la vue de collection) selon les besoins.

J'aimerais peaufiner un peu les choses maintenant que la fonction principale est opérationnelle et que je ne souhaite pas ajouter d'animation subtile aux sous-vues contenues dans ma vue vide, telle que faire en sorte que le rebond imageview contenu soit affiché.

Ma question est donc la suivante: quel est le meilleur moyen de détecter si la variable UIView est affichée (c’est-à-dire qu’il existe un rappel de type viewDidAppear que je pourrais utiliser)?

Question supplémentaire: je suis nouveau dans ce domaine ... L'ajout de la vue vide et le basculement de la propriété isHidden sont-ils un bon moyen de le faire? Ou devrais-je le faire d'une manière différente? (c.-à-d. devrais-je plutôt créer et détruire la vue au besoin, plutôt que de la conserver)

Merci

5
TRG

Cela fonctionne, j'espère que cela peut vous aider. Pour masquer la vue:

UIView.animate(withDuration: 0.3/*Animation Duration second*/, animations: {
     self.EmptyCollectionView.alpha = 0
}, completion:  {
   (value: Bool) in
       self.EmptyCollectionView.isHidden = true
})

Pour afficher la vue:

self.EmptyCollectionView.isHidden = false
UIView.animate(withDuration: 0.3, animations: {
         self.EmptyCollectionView.alpha = 1
    }, completion:  nil)
8
Mert YILDIZ

Le meilleur moyen à mon avis est d'étendre UIView

extension UIView {

    func fadeIn(_ duration: TimeInterval? = 0.2, onCompletion: (() -> Void)? = nil) {
        self.alpha = 0
        self.isHidden = false
        UIView.animate(withDuration: duration!,
                       animations: { self.alpha = 1 },
                       completion: { (value: Bool) in
                          if let complete = onCompletion { complete() }
                       }
        )
    }

    func fadeOut(_ duration: TimeInterval? = 0.2, onCompletion: (() -> Void)? = nil) {
        UIView.animate(withDuration: duration!,
                       animations: { self.alpha = 0 },
                       completion: { (value: Bool) in
                           self.isHidden = true
                           if let complete = onCompletion { complete() }
                       }
        )
    }

}

Il vous suffit donc d'appeler view.fadeIn() pour une animation par défaut de 0,2 seconde, ou view.fadeIn(1) pour la faire durer une seconde.

Vous pouvez même ajouter un événement d'achèvement:

view.fadeOut(0.5, onCompletion: {
    print("Animation completed, do whatever you want")
})
6
AndroidGuy

Extension Swift 4.2 pour autoriser l'animation lorsque l'option isHidden est définie sur une classe UIView:

extension UIView {
    func setIsHidden(_ hidden: Bool, animated: Bool) {
        if animated {
            if self.isHidden && !hidden {
                self.alpha = 0.0
                self.isHidden = false
            }
            UIView.animate(withDuration: 0.2, animations: {
                self.alpha = hidden ? 0.0 : 1.0
            }) { (complete) in
                self.isHidden = hidden
            }
        } else {
            self.isHidden = hidden
        }
    }
}
1
Mark

Vous pouvez animer la propriété alpha de EmptyCollectionView sur 0 pour masquer ou sur 1 pour afficher

UIView.animate(withDuration: 0.5) { 
    self.EmptyCollectionView.alpha = 0
}

Assurez-vous également que isOpaque property est défini sur False pour activer la transparence de la vue.

0
Mohamed Mostafa