Voici un code avec lequel je lutte pendant un moment.
Si vous démarrez l'animation d'ouverture en fondu, le texte de l'étiquette apparaît en fondu… .. Si je lance l'animation en fondu, le texte de l'étiquette disparaît.
Lorsque je lance la méthode startFade
, seul le fondu en fondu est affiché. Comment puis-je attendre que la méthode fadeIn
se termine visuellement avant de démarrer la méthode fadeOut
.
-(IBAction)startFade:(id)sender{
[self fadeIn];
[self fadeOut];
}
-(IBAction)fadeIn:(id)sender{
[self fadeIn];
}
-(IBAction)fadeOut:(id)sender{
[self fadeOut];
}
-(void) fadeIn{
[_label setAlpha:0];
[UILabel beginAnimations:NULL context:nil];
[UILabel setAnimationDuration:2.0];
[_label setAlpha:1];
[UILabel commitAnimations];
}
-(void) fadeOut{
[UILabel beginAnimations:NULL context:nil];
[UILabel setAnimationDuration:2.0];
[_label setAlpha:0];
[UILabel commitAnimations];
}
Lorsque vous appelez les méthodes fadeIn
et fadeOut
deux à la fois, le code s'exécute instantanément. Vous ne verrez donc que l'animation de la dernière méthode appelée. L'animation basée sur les blocs UIView fournit un gestionnaire de complétion, qui semble être exactement ce que vous recherchez. Donc, votre code pourrait ressembler à quelque chose comme ça:
-(IBAction)startFade:(id)sender {
[_label setAlpha:0.0f];
//fade in
[UIView animateWithDuration:2.0f animations:^{
[_label setAlpha:1.0f];
} completion:^(BOOL finished) {
//fade out
[UIView animateWithDuration:2.0f animations:^{
[_label setAlpha:0.0f];
} completion:nil];
}];
}
Rapide:
@IBAction func startFade(_ sender: AnyObject) {
label.alpha = 0.0
// fade in
UIView.animate(withDuration: 2.0, animations: {
label.alpha = 1.0
}) { (finished) in
// fade out
UIView.animate(withDuration: 2.0, animations: {
label.alpha = 0.0
})
}
}
cela fait le travail pour vous (le _label
est votre étiquette);
- (IBAction)startFade:(id)sender {
[_label setAlpha:0.f];
[UIView animateWithDuration:2.f delay:0.f options:UIViewAnimationOptionCurveEaseIn animations:^{
[_label setAlpha:1.f];
} completion:^(BOOL finished) {
[UIView animateWithDuration:2.f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
[_label setAlpha:0.f];
} completion:nil];
}];
}
Essaye ça..
// Disparaître
-(void)fadeOut:(UIView*)viewToDissolve withDuration:(NSTimeInterval)duration andWait:(NSTimeInterval)wait
{
[UIView beginAnimations: @"Fade Out" context:nil];
// wait for time before begin
[UIView setAnimationDelay:wait];
// druation of animation
[UIView setAnimationDuration:duration];
viewToDissolve.alpha = 0.0;
[UIView commitAnimations];
}
// Ouverture en fondu
-(void) fadeIn:(UIView*)viewToFadeIn withDuration:(NSTimeInterval)duration andWait:(NSTimeInterval)wait
{
[UIView beginAnimations: @"Fade In" context:nil];
// wait for time before begin
[UIView setAnimationDelay:wait];
// druation of animation
[UIView setAnimationDuration:duration];
viewToFadeIn.alpha = 1;
[UIView commitAnimations];
}
// Fondu depuis fondu
-(void) fadeInFromFadeOut: (UIView*)viewToFadeIn withDuration:(NSTimeInterval)duration
{
viewToFadeIn.hidden=NO;
[self fadeOut:viewToFadeIn withDuration:1 andWait:0];
[self fadeIn:viewToFadeIn withDuration:duration andWait:0];
}
// opération des boutons
-(void) buttonClicked :(id)sender
{
NSLog(@"Button clicked");
// Each button is given a tag
int tag = ((UIButton*)sender).tag;
if (tag ==1)
{
Sprite.alpha =1;
[self fadeOut : Sprite withDuration: 10 andWait : 1 ];
}
else if (tag ==2)
{
Sprite.alpha =0;
[self fadeIn : Sprite withDuration: 3 andWait : 1 ];
}
else
{
[self fadeInFromFadeOut:Sprite withDuration:10];
}
}
Voir ce lien pour télécharger un exemple ..
Référez-vous à ce link .
Heureux de partager avec vous .. :-)
Réponse générique: Vous pouvez utiliser cette méthode pour appliquer une animation à tout objet UIView . Créez tout d'abord une extension de la classe UIView. Créez un fichier Swift séparé et écrivez le code comme ceci
import Foundation
import UIKit
extension UIView {
func fadeIn(){
UIView.animateWithDuration(1.0, delay: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations: {
self.alpha = 1.0
}, completion: nil)
}
func fadeOut(){
UIView.animateWithDuration(1.0, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {
self.alpha = 0.0
}, completion: nil)
}
}
Ici, on se réfère à UIView auquel vous vous référez. Vous pouvez utiliser des boutons, des étiquettes, etc. pour appeler ces 2 méthodes.
Ensuite, dans toute autre classe Swift, vous pouvez appeler fadeIn () et fadeOut () comme ceci:
self.yourUIObject.fadeIn()
self.yourUIObject.fadeOut()
Cela donne l'effet désiré d'animation à n'importe quel objet UIO.
Basé sur la réponse de @ holex, mais simplifié un peu (comme indiqué):
- (IBAction)startFade:(id)sender {
[_label setAlpha:0.f];
[UIView animateWithDuration:2.f
delay:0.f
options:UIViewAnimationOptionCurveEaseIn
| UIViewAnimationOptionAutoreverse
animations:^{
[_label setAlpha:1.f];
}
completion:nil];
}
vous pouvez faire quelque chose comme ceci (vérifiez les valeurs de paramètres possibles et les méthodes similaires ici: https://developer.Apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html
[UIView animateWithDuration:duration
delay:delay
options:option
animations:^{
//fade in here (changing alpha of UILabel component)
}
completion:^(BOOL finished){
if(finished){
//start a fade out here when previous animation is finished (changing alpha of UILabel component)
}];
}
labelAnimate = (UILabel*) [self.view viewWithTag:101];
btnTapMe = (UIButton*) [self.view viewWithTag:100];
[btnTapMe addTarget:self action:@selector(startAnimating:) forControlEvents:UIControlEventTouchUpInside];
//////////////
-(void) startAnimating:(UIButton*)button {
[labelAnimate setAlpha:0.0];
[NSTimer scheduledTimerWithTimeInterval:1.8 target:self selector:@selector(continuousEaseInOut) userInfo:button repeats:YES];
}
-(void) continuousFadeInOut {
[UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
[labelAnimate setAlpha:1.0];
} completion:^(BOOL finished) {
[UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[labelAnimate setAlpha:0.0];
} completion:nil];
}];
}
Le moyen le plus simple serait d'utiliser:
[UIView animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion]
et ajoutez l'appel fadeOut
au bloc completion
. La documentation pourrait aider à répondre à vos questions.
Si vous ne pouvez pas utiliser la version de blocage pour une raison quelconque, vous devrez définir un délégué ([UIView setAnimationDelegate:(id)delegate]
) et un sélecteur avec ([UIView setAnimationDidStopSelector:]
) auxquels le délégué répondra.
Encore une fois, voir la documentation pour plus de détails.
Je vous suggère fortement d'utiliser une implémentation générique afin de pouvoir réutiliser le code à chaque fois que vous aurez besoin de l'effet de fondu.
Vous devriez créer une extension UIView
:
UIView+Animations.h
#import <Foundation/Foundation.h>
@interface UIView (Animations)
- (void)fadeInWithCompletion:(void (^ __nullable)(BOOL finished))completion;
- (void)fadeOutWithCompletion:(void (^ __nullable)(BOOL finished))completion;;
@end
UIView+Animations.m
#import "UIView+Animations.h"
@implementation UIView (Animations)
- (void)fadeInWithCompletion:(void (^ __nullable)(BOOL finished))completion {
[UIView animateWithDuration:2 animations:^{
[self setAlpha:1];
} completion:completion];
}
- (void)fadeOutWithCompletion:(void (^ __nullable)(BOOL finished))completion {
[UIView animateWithDuration:2 animations:^{
[self setAlpha:0];
} completion:completion];
}
@end
Donc, il vous suffit d'importer le nouveau fichier dans votre classe ou dans votre Prefix.pch
et de l'utiliser comme ceci:
[_label fadeOutWithCompletion:^(BOOL finished) {
[_label fadeInWithCompletion:nil];
}];
Notez que vous pouvez également utiliser nil
comme paramètre de complétion lorsque vous n'avez plus rien à faire après la fin.
Je vous recommande également de ne pas paramétrer la durée pour conserver un motif dans toute votre application.
Cette implémentation peut être utilisée à l'avenir pour UIButton
, UILabel
, UITextField
... Eh bien, toute classe dérivée de UIView
.
Ma tâche était de faire disparaître une étiquette. Et puis fondu avec le texte modifié. La solution était:
-(void)performAnimationOnHistoryButtonLabelUpdatingTextTo:(NSString *)text
{
[UIView animateWithDuration:0.4f animations:^{
[self.historyButtonLabel setAlpha:0.0f];
} completion:^(BOOL finished) {
self.historyButtonLabel.text = text;
[UIView animateWithDuration:0.4f animations:^{
[self.historyButtonLabel setAlpha:1.0f];
} completion:nil];
}];
}
Swift 4 Si vous n'avez besoin que d'une impulsion lorsque vous cliquez sur le bouton, utilisez-le:
@IBAction func didPressButton(_ sender: UIButton) {
self.someView.alpha = 0
UIView.animate(withDuration: 0.4,
delay: 0,
options: [.curveEaseInOut, .autoreverse],
animations: {
self.someView.alpha = 1
},
completion: { _ in
self.someView.alpha = 0
})
}
Les animations d'ouverture et de fermeture en fondu peuvent être combinées à l'aide de UIView.animate(withDuration: animations:)
UIView.animate(withDuration: animationDuration, animations: {
myView.alpha = 0.75
myView.alpha = 1.0
})