Je cherche à faire un fondu d'étiquette, dans viewDidLoad()
, puis après un minuteur à 3 fondus. Je ne connais pas les fonctions fadein
ou fadeout
.
Comment pourrais-je procéder?
Même si la vue est chargée, elle peut ne pas être visible par l'utilisateur lorsque viewDidLoad
est appelé. Cela signifie que vous pourriez trouver que vos animations semblent avoir déjà commencé lorsque vous en êtes témoin. Pour résoudre ce problème, vous souhaiterez plutôt démarrer votre animation dans viewDidAppear
.
Quant aux fonctions fadeIn
et fadeOut
- elles n'existent pas. Vous devrez les écrire vous-même. Heureusement, c'est très facile à faire. Quelque chose comme ci-dessous pourrait être suffisant.
func fadeViewInThenOut(view : UIView, delay: NSTimeInterval) {
let animationDuration = 0.25
// Fade in the view
UIView.animateWithDuration(animationDuration, animations: { () -> Void in
view.alpha = 1
}) { (Bool) -> Void in
// After the animation completes, fade out the view after a delay
UIView.animateWithDuration(animationDuration, delay: delay, options: .CurveEaseInOut, animations: { () -> Void in
view.alpha = 0
},
completion: nil)
}
}
Ma suggestion est de tirer parti des extensions Swift pour rendre le code un peu plus modulaire et facile à utiliser. Par exemple, si vous voulez faire fondre/sortir plusieurs étiquettes ou une étiquette pour entrer/sortir en fondu) sur plusieurs vues, vous devrez passer les méthodes animateWithDuration partout, ce qui peut être un problème. Une alternative plus propre consiste à créer un fichier appelé UIView.Swift (notre extension UIView). Ajoutez le code suivant à ce fichier:
import Foundation
extension UIView {
func fadeIn(duration: NSTimeInterval = 1.0, delay: NSTimeInterval = 0.0, completion: ((Bool) -> Void) = {(finished: Bool) -> Void in}) {
UIView.animateWithDuration(duration, delay: delay, options: UIViewAnimationOptions.CurveEaseIn, animations: {
self.alpha = 1.0
}, completion: completion) }
func fadeOut(duration: NSTimeInterval = 1.0, delay: NSTimeInterval = 3.0, completion: (Bool) -> Void = {(finished: Bool) -> Void in}) {
UIView.animateWithDuration(duration, delay: delay, options: UIViewAnimationOptions.CurveEaseIn, animations: {
self.alpha = 0.0
}, completion: completion)
}
}
Vous pouvez maintenant ajouter la fonctionnalité fadeIn/fadeout à n'importe quel enfant d'UIView (par exemple, UILabel, UIImage, etc.). À l'intérieur de votre fonction viewDidLoad (), vous pouvez ajouter:
self.statusLabel.alpha = 0
self.statusLabel.text = "Sample Text Here"
self.myLabel.fadeIn(completion: {
(finished: Bool) -> Void in
self.myLabel.fadeOut()
})
Maintenant, vous pouvez utiliser cet exemple de code pour les vues d'image, les étiquettes, les vues de texte, les vues de défilement ou tout enfant d'UIView. J'espère que ça aide.
Réponse mise à jour pour Swift 3 - Utilisation de l'extension
extension UIView {
func fadeIn(duration: TimeInterval = 1.0, delay: TimeInterval = 0.0, completion: @escaping ((Bool) -> Void) = {(finished: Bool) -> Void in}) {
UIView.animate(withDuration: duration, delay: delay, options: UIViewAnimationOptions.curveEaseIn, animations: {
self.alpha = 1.0
}, completion: completion)
}
func fadeOut(duration: TimeInterval = 1.0, delay: TimeInterval = 3.0, completion: @escaping (Bool) -> Void = {(finished: Bool) -> Void in}) {
UIView.animate(withDuration: duration, delay: delay, options: UIViewAnimationOptions.curveEaseIn, animations: {
self.alpha = 0.0
}, completion: completion)
}
}
tilisation:
self.statusLabel.alpha = 0
self.statusLabel.text = "Sample Text Here"
self.myLabel.fadeIn(completion: {
(finished: Bool) -> Void in
self.myLabel.fadeOut()
})
Mettre à jour Swift 3.1 - sur le code @Andy
func fadeViewInThenOut(view : UIView, delay: TimeInterval) {
let animationDuration = 0.25
// Fade in the view
UIView.animate(withDuration: animationDuration, animations: { () -> Void in
view.alpha = 1
}) { (Bool) -> Void in
// After the animation completes, fade out the view after a delay
UIView.animate(withDuration: animationDuration, delay: delay, options: [.curveEaseOut], animations: { () -> Void in
view.alpha = 0
}, completion: nil)
}
}
Swift 4.2
extension UIView {
func fadeIn(duration: TimeInterval = 1.0, delay: TimeInterval = 0.0, completion: @escaping ((Bool) -> Void) = {(finished: Bool) -> Void in}) {
UIView.animate(withDuration: duration, delay: delay, options: .curveEaseIn, animations: {
self.alpha = 1.0
}, completion: completion)
}
func fadeOut(duration: TimeInterval = 1.0, delay: TimeInterval = 3.0, completion: @escaping (Bool) -> Void = {(finished: Bool) -> Void in}) {
UIView.animate(withDuration: duration, delay: delay, options: .curveEaseIn, animations: {
self.alpha = 0.0
}, completion: completion)
}
}
Swift 5
Cela a bien fonctionné pour moi. J'ai placé l'étiquette à l'intérieur du "cardHeaderView".
@IBOutlet weak var cardHeaderView: UIView!
Placez-le dans le "viewDidAppear". J'y suis allé avec un retard de zéro pour que l'animation commence tout de suite.
fadeViewInThenOut(view: cardHeaderView, delay: 0)
Voici la fonction.
func fadeViewInThenOut(view : UIView, delay: TimeInterval) {
let animationDuration = 1.5
UIView.animate(withDuration: animationDuration, delay: delay, options: [UIView.AnimationOptions.autoreverse, UIView.AnimationOptions.repeat], animations: {
view.alpha = 0
}, completion: nil)
}