web-dev-qa-db-ja.com

フェードインフェードアウトアニメーション

ここに私がしばらく苦労しているコードがあります。

フェードインアニメーションを開始すると、ラベルテキストがフェードインします。フェードアウトアニメーションを開始すると、ラベルテキストがフェードアウトします。

startFadeメソッドを開始すると、フェードアウトのみが表示されます。 fadeInメソッドを開始する前に、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];
}
51
HiDuEi

fadeInおよびfadeOutメソッドを連続して呼び出すと、コードが即座に実行されるため、最後に呼び出されたメソッドのアニメーションのみが表示されます。 UIViewブロックベースのアニメーションは完了ハンドラーを提供します。これはまさにあなたが探しているもののようです。したがって、コードは次のようになります。

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

    }];
}

迅速:

@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
        })
    }
}
112
hgwhittle

それはあなたのために仕事をします(_labelはあなたのラベルです);

- (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

これを試して..

// フェードアウト

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

// フェードイン

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

}

//フェードアウトからフェードイン

-(void) fadeInFromFadeOut: (UIView*)viewToFadeIn withDuration:(NSTimeInterval)duration
{
    viewToFadeIn.hidden=NO;
    [self fadeOut:viewToFadeIn withDuration:1 andWait:0];
    [self fadeIn:viewToFadeIn withDuration:duration andWait:0];

}

//ボタン操作

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

これを表示 リンク サンプルをダウンロードするには..

これを参照してください link

あなたと共有して幸せ.. :-)

6
yazh

一般的な答え:このメソッドを使用して、任意のUIViewオブジェクトにアニメーションを適用できます。最初にUIViewクラスの拡張を作成します。別のSwiftファイルを作成し、次のようなコードを記述します

import Foundation
import UIKit

extension UIView {

    func fadeIn() {
        //Swift 2
        UIView.animateWithDuration(1.0, delay: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations: {
            self.alpha = 1.0
        }, completion: nil)

        //Swift 3, 4, 5
        UIView.animate(withDuration: 1.0, delay: 0.0, options: UIView.AnimationOptions.curveEaseIn, animations: {
            self.alpha = 1.0
        }, completion: nil)
    }


    func fadeOut() {
        //Swift 2
        UIView.animateWithDuration(1.0, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {
            self.alpha = 0.0
        }, completion: nil)

        //Swift 3, 4, 5
        UIView.animate(withDuration: 1.0, delay: 0.0, options: UIView.AnimationOptions.curveEaseOut, animations: {
            self.alpha = 0.0
        }, completion: nil)
    }


}

ここでselfは、参照するUIViewを指します。これらの2つのメソッドを呼び出すには、ボタン、ラベルなどを使用できます。

次に、他のSwiftクラスで、次のようにfadeIn()およびfadeOut()を呼び出すことができます。

self.yourUIObject.fadeIn()
self.yourUIObject.fadeOut()

これにより、任意のUIObjectにアニメーションの望ましい効果が与えられます。

4
iPhoneDeveloper

@holexの回答に基づいていますが、少し簡略化されています(コメントどおり):

- (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

このようなことをすることができます(可能なパラメーター値と同様のメソッドをここで確認してください: 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

Swift 4ボタンをクリックするときに1つのパルスだけが必要な場合は、それを使用します:

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

最も簡単な方法は次のとおりです。

[UIView animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion]

fadeOut呼び出しをcompletionブロックに追加します。 ドキュメント は、質問に対する回答に役立つ場合があります。

何らかの理由でブロックバージョンを使用できない場合は、デリゲート([UIView setAnimationDelegate:(id)delegate])と、デリゲートが応答するセレクター([UIView setAnimationDidStopSelector:])を設定する必要があります。

繰り返しになりますが、詳細は ドキュメント をご覧ください。

1
jemmons

フェードエフェクトが再び必要になったときにコードを再利用できるように、一般的な実装を使用することを強くお勧めします。

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

したがって、新しいファイルをクラスまたはPrefix.pch内にインポートして、次のように使用するだけです。

[_label fadeOutWithCompletion:^(BOOL finished) {
   [_label fadeInWithCompletion:nil];
}];

完了後に他に何もする必要がない場合は、nilを完了パラメーターとして使用することもできます。

また、アプリケーション全体でパターンを維持するために、期間をパラメーター化しないことをお勧めします。

この実装は、将来、UIButtonUILabelUITextField...で使用できます。まあ、UIViewから派生した任意のクラス。

1
joao.arruda

私の仕事は、ラベルをフェードアウトさせることでした。そして、変更されたテキストでフェードインします。解決策は次のとおりです。

    -(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

フェードインとフェードアウトのアニメーションは、UIView.animate(withDuration: animations:)を使用して組み合わせることができます

UIView.animate(withDuration: animationDuration, animations: {
            myView.alpha = 0.75
            myView.alpha = 1.0
        })
0
ArunGJ

IPhoneDeveloperの答えのSwift 5バージョン:

extension UIView {

func fadeIn() {
    UIView.animate(withDuration: 1.0, delay: 0.0, options: UIView.AnimationOptions.curveEaseIn, animations: {
        self.alpha = 1.0
    }, completion: nil)
}


func fadeOut() {
    UIView.animate(withDuration: 1.0, delay: 0.0, options: UIView.AnimationOptions.curveEaseOut, animations: {
        self.alpha = 0.0
    }, completion: nil)
}

}

0
jglasse