2013-02-15 3 views
12

J'essaye d'animer le décalage d'une table vers le bas, puis dans le bloc d'achèvement je le remonte. Mais mon code ne fait rien dans le bloc d'achèvement:UIView Animer et terminer le bloc

-(void)viewDidAppear:(BOOL)animated { 
    if (TRUE) { 
     NSLog(@"animating table view"); 

     [UIView animateWithDuration:.25 
         animations:^{ 
          self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y - 60); 
         } 
         completion:^(BOOL finished){ 
          NSLog(@"completion block"); 
         }]; 
    } 
} 

"bloc d'achèvement" n'est jamais sorti ... des idées?

EDIT:

Ok, donc il a quelque chose à voir avec mon UIREfreshControl:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    if (TRUE) { 
     UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 
     refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
     [refresh addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged]; 

     [self setRefreshControl:refresh]; 
    } 
} 

Lorsque la controll de rafraîchissement est ajouté, il ne se déclenche pas sur le bloc d'achèvement. Si je ne rajoute pas le contrôle, cela fonctionne comme prévu.

EDIT 2:

K, donc si je fais défiler l'affichage du tableau, le bloc d'achèvement est ensuite tiré:

2013-02-15 13:37:06.266 [1922:14003] animating table view 
2013-02-15 13:37:14.782 [1922:14003] completion block 

le code tel qu'il est écrit doit ouvrir une session "bloc d'achèvement" juste après « table animant voir ", mais il a un retard de 8 secondes parce que c'est quand je fais défiler la vue de la table moi-même.

comment le "Tirer pour Refresh" ressemble à:

enter image description here

+1

juste tryed votre code sur le projet de test, et ' Vous avez essayé ceci sur le simulateur ou sur l'appareil Quelle version iOS vous avez utilisée, la version XCode? – jamapag

+0

Simulator, iOS 6.1, xcode 4.6 Vous l'avez fait dans la méthode 'viewDidAppear:' – Padin215

+1

Hmm, je J'ai la même configuration. Est-ce que 'viewDidAppear' est appelé? – jamapag

Répondre

8

J'ai été en mesure de reproduire ce problème et j'ai trouvé une solution de contournement.

Lors de l'utilisation d'un UIScrollView, dont UITableView hérite, vous ne pouvez pas modifier son contentOffset n'est pas une propriété animable. Au lieu de cela, vous devez utiliser la méthode setContentOffset:animated:.

Alors, ce que vous devez faire est la suivante:

  1. Réglez votre contrôleur de vue en tant que délégué UITableView. J'ai fait au viewDidAppear.
  2. Définissez un indicateur pour que le délégué sache que le défilement s'est produit car vous l'avez déclenché.
  3. Dans la méthode déléguée - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView, rebondir l'animation (vous pouvez ajouter ici un retard en utilisant performSelector:afterDelay:

Voici le code:.

@interface MyViewController() 

@property (assign, nonatomic) BOOL shouldReturn; 

@end 

@implementation MyViewController 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (TRUE) { 
     NSLog(@"animating table view"); 
     self.shouldReturn = YES; 
     self.tableView.delegate = self; 
     [self.tableView setContentOffset: 
        CGPointMake(self.tableView.contentOffset.x, 
           self.tableView.contentOffset.y - 60) 
           animated:YES]; 
    } 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    if (TRUE) { 
     UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 
     refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
     [refresh addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged]; 

     [self setRefreshControl:refresh]; 
    } 
} 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { 
    if (self.shouldReturn) { 
     self.shouldReturn = NO; 
     [self.tableView setContentOffset:CGPointZero animated:YES]; 
    } 
} 

@end 
+0

Ok, cela fonctionne! Je ne sais pas pourquoi vous définissez 'self.tableView.delegate = self'. Je n'ai pas ajouté cela et ça fonctionne. J'ai ajouté un '[self performSelector: @selector (test) withObject: nil afterDelay: 2] 'et fonctionne parfaitement, merci! – Padin215

+0

+1, @pgb, bonne capture .. – iDev

+0

Je définis le délégué parce que je ne l'ai pas câblé sur IB. Je suppose que vous ne l'avez pas rencontré parce que votre contrôleur de vue était déjà le délégué de la table. – pgb

13

je cela et bien travailler. Sa solution alternative.

[UIView animateWithDuration:0.5 
           delay:0.1 
          options: UIViewAnimationOptionCurveEaseOut 
         animations:^ 
     { 
      CGRect frame = self.adBannerView.frame; 

      self.adBannerView.frame = frame; 
     } 
         completion:^(BOOL finished) 
     { 
     }]; 

essayez d'ajouter le délai et les options.

+0

Pourquoi cela ferait-il une différence? Il existe une méthode 'animateWithDuration: animations: completion:' ainsi que –

Questions connexes