web-dev-qa-db-fra.com

Fade In Fade Out Animation

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];
}
49
HiDuEi

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
        })
    }
}
108
hgwhittle

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];
    }];
}
32
holex

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 .. :-)

5
yazh

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.

3
iPhoneDeveloper

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];
}
2
Bjørn Egil

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)
                 }];
}
2
Julian Król
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];
    }];
}
1

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.

1
jemmons

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.

1
joao.arruda

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];

    }];
}
1
Naloiko Eugene

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
        })
    }
0
Nik Kov

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
        })
0
ArunGJ