2010-08-23 8 views
1

J'essaie d'attraper quand une animation UIPicker spécifique est terminée.attraper la notification UIPicker selectRow de l'animation terminée

J'ai cherché longtemps une réponse à ceci mais il semble que la réponse commune, qui est de s'assurer que l'appel de selectRow est dans les appels de beginAnimations et de commitAnimations, ne fonctionne pas.
Le problème est que l'animationFinished est déclenchée presque immédiatement après l'appel de commitAnimations et bien avant que l'animation réelle s'arrête. En pensant que le problème pourrait être que le selectRow crée son propre bloc d'animation et que je ne suis pas en train de suivre ce que je veux, j'ai essayé d'appeler selectRow avec animation: NO en espérant que mon propre bloc d'animation reprendrait l'animation du sélecteur . Cela a en effet fait l'animation Finished trigger à la fin de l'animation mais l'animation elle-même est devenue saccadée.

Comment puis-je m'assurer que je suis la bonne animation ou est-ce qu'il me manque autre chose?

Toute information serait grandement appréciée, y compris des références concises à la documentation appropriée que j'ai pu manquer.

Meilleures salutations, M @

Voici le code:

- (void) animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context { 
    NSLog(@"animation %d stopped",animationID); 
} 

- (void)animateToRow:(UIPickerView *)pickerView toRow:(NSInteger)row inComponent:(NSInteger)component 
{ 

    [UIPickerView beginAnimations:@"1" context:nil]; 
    [UIPickerView setAnimationDelegate:self]; 
    [UIPickerView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; 
    [pickerView selectRow:row inComponent:component animated:YES]; 
    [UIPickerView commitAnimations]; 
} 

Répondre

1

Vous êtes sur la bonne voie. Lorsque vous vous définissez en tant que délégué d'animation dans le code que vous avez fourni, vous vous définissez en tant que délégué pour VOTRE bloc d'animation. Comme vous n'avez pas fourni de durée d'animation, votre didStopSelector se déclenchera immédiatement.

Il n'existe pas de méthode "prise en charge" pour cela. Et à peu près n'importe quelle solution n'a aucune garantie d'être compatible avec le futur.

Sans aucun doute, Apple enveloppe l'animation du sélecteur dans ses propres blocs d'animation. Vous pouvez effectuer un débogage créatif et déterminer la durée exacte de leur animation, puis coder en dur votre bloc d'animation. Généralement, les animations UIKit d'Apple sont d'une durée fixe, quelle que soit la distance à parcourir. (assez souvent, c'est environ 0,33 secondes).

Je voudrais essayer ceci ... -Créez une méthode de catégorie pour UIView, et redéfinissez setAnimationDuration: et définissez un point d'arrêt à l'intérieur de cette méthode. (Il est probablement préférable de le désactiver jusqu'à ce que vous soyez prêt, car il sera appelé un nombre écrasant de fois.) -Lorsque votre animateToRow: torRow: inComponent: la méthode est appelée, activez votre point d'arrêt et observez la valeur passé par le bloc d'animation des vues du sélecteur. Définir une méthode de catégorie comme je l'ai dit élimine efficacement la possibilité de définir des durées pour les blocs d'animation UIView, je ne peux pas garantir qu'il n'y aura pas d'effets secondaires, et il est absolument destiné au débogage uniquement.

+0

Nous vous remercions de votre réponse rapide et claire. Alors que je vais certainement essayer cela pour satisfaire ma curiosité, il semble un peu trop ... non pris en charge pour s'appuyer sur un produit de magasin d'application réelle. D'abord et avant tout, ma question est de m'assurer que je ne manque pas un modèle connu ou un moyen officiel de l'API pour ce faire. Si personne d'autre n'en propose un, et que vous suggérez qu'il n'y en a pas, je devrai soit trouver un chemin différent, soit en reconsidérer l'utilisation. Meilleures salutations , M @ –