2014-01-02 3 views
46

Вот несколько кодов, с которыми я немного борюсь.Fade In Fade Out Анимация

Если вы начинаете исчезать в анимации, текст надписи исчезает. Если я начинаю анимацию постепенного исчезновения, текст ярлыка исчезает.

Когда я начинаю метод 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]; 
} 
+0

вы пробовали блок на основе анимации еще? – holex

ответ

101

Когда вы вызываете методы 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]; 

    }]; 
} 

Swift:

@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 
     }) 
    } 
} 
+0

... и где вторая половина эффекта затухания? – holex

+0

Я всегда забываю это сделать. Спасибо, что поймали его. – hgwhittle

2

вы можете сделать что-то вроде этого (проверьте возможные значения параметров и аналогичные методы здесь: 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) 
       }]; 
} 
32

, что делает работу для вас (_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]; 
    }]; 
} 
+4

Может быть упрощено путем добавления UIViewAnimationOptionAutoReverse к параметрам первой анимации, то есть UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionAutoReverse и просто завершение: nil вместо другой анимации. –

+0

@ BjørnEgil, если нет такой цели, которая связана с изменением любого атрибута 'UILabel' между половиной пути, что также может работать. – holex

+0

Да, но это не было частью вопроса. Это было просто, как угасать. –

1

Самый простой способ будет использовать:

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

и добавить fadeOut вызов к completion блока. The documentation может помочь ответить на любые ваши вопросы.

Если вы не можете использовать версию блока по какой-либо причине, вам нужно будет установить делегат ([UIView setAnimationDelegate:(id)delegate]) и селектор с ([UIView setAnimationDidStopSelector:]), на который делегат ответит.

Снова см. the documentation для получения более подробной информации.

1

Моя задача - сделать ярлык ярким. И затем исчезает с измененным текстом. Решение было:

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

    }]; 
} 
2

на основе @ 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]; 
} 
3

Попробуйте это ..

// Fade Out

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

// Fade In

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

} 

// Fade в от замирания из

-(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, чтобы скачать образец.

См. Это link.

Рад поделиться с вами .. :-)

+0

Прохладный материал, все! Выяснилось много ваших идей и подходов. Помогли мне много! – HiDuEi

+0

http://stackoverflow.com/a/29080894/1442541 – evya

1
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. Сначала создайте расширение класса UIView. Создайте отдельный быстрый файл и напишите код, подобный этому

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


} 

Здесь само относится к любому UIView, на который вы ссылаетесь. Для вызова этих двух методов вы можете использовать кнопки, метки и т. Д.

Тогда в любом другом быстром классе можно назвать FadeIn() и FADEOUT(), как это:

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

Это дает желаемый эффект анимации для любого UIObject.

1

Я настоятельно рекомендую вам использовать общую реализацию, чтобы вы могли повторно использовать код всякий раз, когда вам нужен эффект затухания.

Вы должны создать 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.

0

проявки и затемнение анимации могут быть объединены с помощью UIView.animate(withDuration: animations:)

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