2013-03-12 16 views
5

Zastanawiam się, czy możliwe było zastosowanie animacji Flash do UI. Szukałem w Internecie, ale znalazłem tylko kod animacji pulsu, który nieustannie zmienia rozmiar mojego Uibutton. Zamiast tego myślałem o jakiejś migającej animacji, aby ostrzec użytkownika, że ​​musi nacisnąć przycisk. Jedynym podejście do problemu mogę myśleć to zmieniając alfa stale przy użyciu:UIbutton flashowanie animacji

[self setAlpha:0.5]; 

... ale to nie będzie tak widoczny jako przycisk migające.

+0

Czy próbowałeś używać dwóch przycisków (lub jednego fikcyjnego obrazu nad przyciskiem) i ukrywania/pokazywania go w razie potrzeby? –

Odpowiedz

15
nie

Być może najlepszym sposobem, i naprawdę nie pozwalają zatrzymać miganie ... ale to jest proste, działa i nie przeszkadza interakcji użytkownika:

- (void)viewDidLoad 
{ 
    [self flashOn:myButton]; 
} 

- (void)flashOff:(UIView *)v 
{ 
    [UIView animateWithDuration:.05 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^ { 
     v.alpha = .01; //don't animate alpha to 0, otherwise you won't be able to interact with it 
    } completion:^(BOOL finished) { 
     [self flashOn:v]; 
    }]; 
} 

- (void)flashOn:(UIView *)v 
{ 
    [UIView animateWithDuration:.05 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^ { 
     v.alpha = 1; 
    } completion:^(BOOL finished) { 
     [self flashOff:v]; 
    }]; 
} 
+4

Możesz uprościć kod za pomocą opcji animacji 'UIViewAnimationOptionAutoreverse'. Co więcej, jeśli nie chcesz zapętlać animacji na zawsze, wywołaj 'setAnimationRepeatCount:' z wnętrza bloku animacji. –

+0

Za pomocą kodu i zamianę UIview na UIBarButtonItem otrzymuję błąd: alfa właściwości nie znaleziono na obiekcie typu UIBarButtonItem – Alessandro

+1

To dlatego, że UIBarButtonItem nie jest podklasą UIView. Powiedziałeś, że masz UIButton, który chcesz flashować, który jest rzeczywiście podklasą UIView. – MikeS

0

Być może możesz mieć dwa różne pliki .png [przyciski], które obracają się w pętli, przypisują im tę samą akcję i uruchamiają ją, gdy tylko spełniony jest określony warunek. Napisałbym kod, ale prawdopodobnie byłby pełen błędów. Próbowałeś czegoś takiego?

+0

masz na myśli przesuwanie obrazu? Myślałem o zrobieniu czegoś stopniowego, stopniowego zmniejszania jasności – Alessandro

+0

Masz na myśli jak pulsujące spojrzenie? Hm. Ray Wenderlich ma ciekawy samouczek na temat tworzenia klona aplikacji "Wyczyść". Jest to aplikacja do zrobienia listy. W każdym razie, programowo dokonuje zanikania kolorów dla UITableViewCell. Sprawdziłbym ten projekt i sprawdził, czy możesz zastosować te same zasady koloru, co on. Ponownie, to jest tuż poza moją głową. – STANGMMX

+0

możesz dać mi link, dzięki – Alessandro

4

Spróbuj tego:

wywołanie tej metody, jeśli chcesz blink/flash przycisk

blinkTimer=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(toggleButtonImage:) userInfo:nil repeats:YES]; 

i napisać tę metodę

- (void)toggleButtonImage:(NSTimer*)timer 
{ 

    if(toggle) 
    { 
     [blinkBtn setImage:[UIImage imageNamed:@"ButtonImage.png"] forState: UIControlStateNormal]; 
    } 
    else 
    { 
     [blinkBtn setImage:[UIImage imageNamed:@"ButtonImage1.png"] forState: UIControlStateNormal]; 
    } 
    toggle = !toggle; 

} 

w .h napisać ten jeden

NSTimer *blinkTimer; 
BOOL toggle; 

i unieważnia timer, w którym chcesz, aby zatrzymać miganie/migający

[blinkTimer invalidate]; 
1

Zrobiłem to tworząc własną kontrolę, instacji UIControl od firmy Apple nie zaleca wkręcania z hierarchią widoku UIButton. Dodaję obraz tła reprezentujący standardowy obraz tła przycisku i "świecący" obraz. Widok powyżej tła przedstawiający rozjaśniony stan i przełącz jego krycie w celu nadania mu impulsu.

Dodatkowo przełączam zaciemnienie cienia warstwy, aby jaśniała.

Inicjowanie Kod:

- (void)TS_commonButtonInit 
{ 
    UIImage *shoutoutBackground   = [UIImage imageNamed:@"root-navigation-bar-share-button"]; 
    UIImage *shoutoutHighlightedBackground = [UIImage imageNamed:@"root-navigation-bar-share-button-highlighted"]; 
    UIImage *shoutoutPulseImage   = [UIImage imageNamed:@"root-navigation-bar-share-button-glowing"]; 

    shoutoutBackground   = [shoutoutBackground   stretchableImageWithLeftCapWidth:7 topCapHeight:0]; 
    shoutoutHighlightedBackground = [shoutoutHighlightedBackground stretchableImageWithLeftCapWidth:7 topCapHeight:0]; 
    shoutoutPulseImage   = [shoutoutPulseImage   stretchableImageWithLeftCapWidth:7 topCapHeight:0]; 

    [[self backgroundView] setImage:shoutoutBackground]; 
    [[self backgroundView] setHighlightedImage:shoutoutHighlightedBackground]; 

    [self setGlowingImage:shoutoutPulseImage]; 

    [self setExclusiveTouch:YES]; 

    [self addSubview:[self backgroundView]]; 
    [self addSubview:[self glowingImageView]]; 

    [[self layer] setShadowColor:[[UIColor colorWithHexString:@"ffc521" alpha:1] CGColor]]; 
    [[self layer] setShadowOpacity:0]; 
    [[self layer] setShadowRadius:5]; 
    [[self layer] setShadowOffset:CGSizeMake(0, 0)]; 
    [[self layer] setShadowPath:[[UIBezierPath bezierPathWithRoundedRect:[self bounds] cornerRadius:6] CGPath]]; 
} 

Kod Pulsing:

- (void)pulse:(NSInteger)numberOfTimes 
{ 
    CGFloat pulseLength = .8; 

    [[self glowingImageView] setAlpha:0]; 

    CABasicAnimation *pulseAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    [pulseAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
    [pulseAnimation setDuration:pulseLength]; 
    [pulseAnimation setRepeatCount:numberOfTimes]; 
    [pulseAnimation setAutoreverses:YES]; 
    [pulseAnimation setFromValue:@(0)]; 
    [pulseAnimation setToValue:@(1)]; 
    [pulseAnimation setRemovedOnCompletion:YES]; 

    [[self layer] setShadowOpacity:0]; 

    CABasicAnimation *shadowAnimation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"]; 
    [shadowAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
    [shadowAnimation setDuration:pulseLength]; 
    [shadowAnimation setRepeatCount:numberOfTimes]; 
    [shadowAnimation setAutoreverses:YES]; 
    [shadowAnimation setFromValue:@(0)]; 
    [shadowAnimation setToValue:@(1)]; 
    [shadowAnimation setRemovedOnCompletion:YES]; 

    [[[self glowingImageView] layer] addAnimation:pulseAnimation forKey:@"opacity"]; 
    [[self layer] addAnimation:shadowAnimation forKey:@"shadowOpacity"]; 
} 
5

Czytając wszystkie odpowiedzi do tej pory znalazłem następujące rozwiązanie. Powtarza się wiele razy i wykonuje to za mnie.

CGFloat oldAlpha = v.alpha; 
CGFloat minAlpha = 0.2; 
enum UIViewAnimationOptions options = UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionCurveEaseInOut; 

[UIView animateWithDuration:.3 delay:0.3 options:options animations:^{ 
    [UIView setAnimationRepeatCount:4]; 
    v.alpha = minAlpha; 
} 
completion:^(BOOL finished) { 
    v.alpha = oldAlpha; 
}]; 
+0

Dzięki za zwięzły kod. Jeśli chcesz, aby przycisk zniknął natychmiast po dotknięciu, ustaw v.alpha = minAlpha przed blokiem animacji i ustaw ten, który znajduje się wewnątrz bloku na 1,0 lub na stary alfa. Uważam, że wygląda nieco bardziej jak użytkownik wywołał animację. – neoscribe