ここに私がしばらく苦労しているコードがあります。
フェードインアニメーションを開始すると、ラベルテキストがフェードインします。フェードアウトアニメーションを開始すると、ラベルテキストがフェードアウトします。
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];
}
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
})
}
}
それはあなたのために仕事をします(_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];
}];
}
これを試して..
// フェードアウト
-(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 。
あなたと共有して幸せ.. :-)
一般的な答え:このメソッドを使用して、任意の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にアニメーションの望ましい効果が与えられます。
@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];
}
このようなことをすることができます(可能なパラメーター値と同様のメソッドをここで確認してください: 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)
}];
}
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
})
}
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];
}];
}
最も簡単な方法は次のとおりです。
[UIView animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion]
fadeOut
呼び出しをcompletion
ブロックに追加します。 ドキュメント は、質問に対する回答に役立つ場合があります。
何らかの理由でブロックバージョンを使用できない場合は、デリゲート([UIView setAnimationDelegate:(id)delegate]
)と、デリゲートが応答するセレクター([UIView setAnimationDidStopSelector:]
)を設定する必要があります。
繰り返しになりますが、詳細は ドキュメント をご覧ください。
フェードエフェクトが再び必要になったときにコードを再利用できるように、一般的な実装を使用することを強くお勧めします。
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
を完了パラメーターとして使用することもできます。
また、アプリケーション全体でパターンを維持するために、期間をパラメーター化しないことをお勧めします。
この実装は、将来、UIButton
、UILabel
、UITextField
...で使用できます。まあ、UIView
から派生した任意のクラス。
私の仕事は、ラベルをフェードアウトさせることでした。そして、変更されたテキストでフェードインします。解決策は次のとおりです。
-(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];
}];
}
フェードインとフェードアウトのアニメーションは、UIView.animate(withDuration: animations:)
を使用して組み合わせることができます
UIView.animate(withDuration: animationDuration, animations: {
myView.alpha = 0.75
myView.alpha = 1.0
})
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)
}
}