2012-12-25 16 views
2

Dans le code suivant, il y a 2 méthodes qui s'appellent l'une après l'autre. Le premier fait disparaître le bouton central et le second fait disparaître la barre d'onglets. Séparément, ils fonctionnent bien. Mon problème est que lorsque j'essaie de les appeler l'un après l'autre hideCenterButton ne s'anime pas. Au lieu de rouler à gauche de l'écran, le bouton disparaît.Essayer de faire fonctionner 2 animations simultanément

-(void)hideCenterButton:(BOOL)animated 
{ 
    if(animated){ 

     [UIView animateWithDuration:0.3 
           delay:0.0f 
          options:UIViewAnimationCurveLinear 
         animations:^{ 
          CGRect frame = self.centerButton.frame; 
          frame.origin.x = -100; 
          self.centerButton.frame = frame; 
         } 
         completion:^(BOOL finished){ 
         }]; 
    }} 

...

- (void)hideTabBar:(UITabBarController *) tabbarcontroller 
    { 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:0.5]; 
     //[UIView setAnimationDelay:1]; 
     for(UIView *view in tabbarcontroller.view.subviews) 
     { 
      if([view isKindOfClass:[UITabBar class]] || [view isKindOfClass:[UIImageView class]]) 
      { 
       [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)]; 
      } 
      else 
      { 
       [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)]; 
      } 
     } 

     [UIView commitAnimations]; 
    } 
+0

Ne pas abuser de l'étiquette de code x. – yinkou

Répondre

2

Vous avez probablement frappé dans une sorte de limitation des animations à base UIView. Plusieurs choses que vous pourriez essayer sont:

  1. utilisation animateWithDuration aussi pour hideTabBar:: en effet, beginAnimation est l'ancienne manière d'animer UIView; animateWithDuration est plus récent (introduit avec iOS4); en utilisant les mêmes appels d'animation dans les cas de bot, vous obtiendrez de meilleurs résultats; cela devrait être simple; cela devrait fonctionner:

    - (void)hideTabBar:(UITabBarController *) tabbarcontroller 
        { 
    [UIView animateWithDuration:0.3 
             delay:0.0f 
            options:UIViewAnimationCurveLinear 
           animations:^{ 
        for(UIView *view in tabbarcontroller.view.subviews) 
        { 
        if([view isKindOfClass:[UITabBar class]] || [view isKindOfClass:[UIImageView class]]) 
        { 
         [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)]; 
        } 
        else 
        { 
         [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)]; 
        } 
        } 
           } 
           completion:nil]; 
    } 
    
  2. Ressaisissez votre animation en utilisant Core Animation: c'est un mécanisme de niveau inférieur légèrement, mais il vous permet d'obtenir les meilleurs résultats en termes de performance; c'est, par exemple, comment vous pouvez réécrire la première animation:

d'abord, vous devez fournir un rappel:

- (void)animationDidStop:(CABasicAnimation*)anim finished:(BOOL)flag { 
     CALayer* layer = [anim valueForKey:@"animationLayer"]; 
     layer.position = [anim.toValue CGPointValue]; 
} 

vous pouvez animer votre bouton comme ceci:

CABasicAnimation* move = [CABasicAnimation animationWithKeyPath:@"position"]; 
    CGPoint pos = self.centerButton.center; 
    pos.x -= 100; 
    move.toValue = [NSValue valueWithCGPoint:pos]; 
    move.duration = 0.3; 
    move.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    move.removedOnCompletion = NO; 
    move.fillMode = kCAFillModeForwards; 
    move.autoreverses = NO; 
    move.delegate = self; 
    [move setValue:self.centerButton.layer forKey:@"animationLayer"]; 
    [self.centerButton.layer addAnimation:move forKey:@"buttonPosition"]; 

En utilisant Core Animation, vous finirez par écrire plus de code et vous aurez besoin d'un peu de temps pour apprendre les bases du Core Animation, mais c'était la seule façon de résoudre un problème similaire que j'avais avec deux animations.

Espérons que ça aide.

+0

Je n'ai aucune idée comment convertir 'hideTabBar' en' animateWithDuration' mais je vais certainement lire sur l'animation de base. – Segev

+0

J'ai ajouté un peu plus de code à titre d'exemple, y compris pour 'animateWithDuration'. – sergio

+0

La première solution ne change rien mais j'ai appris quelque chose de nouveau donc +1 juste pour ça. :) J'essaie la deuxième solution mais je reçois une erreur pour les 2 dernières lignes (évidemment). Que devrais-je mettre là au lieu de 'subview'? – Segev

Questions connexes