2010-05-19 4 views
8

Je me sens comme si je devais le savoir, mais j'ai été déconcerté pendant des heures maintenant et je n'ai plus d'idées.performSelector: withObject: afterDelay: ne fonctionne pas à partir de scrollViewDidZoom

La théorie est simple, l'utilisateur manipule le zoom et le positionnement dans un scrollview en utilisant une pincée. Si elles maintiennent ce pincement pendant une courte période de temps, le scrollview enregistre le niveau de zoom et les décalages de contenu.

Alors j'ai pensé que je commencerais un execSelector: withObject: withDelay sur la méthode de délégué scrollViewDidZoom. Si elle expire, j'enregistre les paramètres. Je supprime l'appel programmé à chaque appel de scrollViewDidZoom et lorsque le geste de pincement est terminé.

C'est ce que j'ai:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView{ 
    NSLog(@"resetting timer"); 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil]; 

    [self performSelector:@selector(positionLock) withObject:nil afterDelay:0.4];    
} 

-(void)positionLock{ 
    NSLog(@"position locked "); 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{ 

    NSLog(@"deleting timer"); 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil]; 
} 

Ceci est la sortie:

2010-05-19 22: 43: 01,931 minuterie réinitialisation
2010-05-19 22: 43: 01,964 la réinitialisation de la minuterie
19/05/2010 22: 43: 02,231 minuterie réinitialisation
19/05/2010 22: 43: 02,253 minuterie réinitialisation
19/05/2010 22: 43: 02,269 minuterie réinitialisation
2010-05-19 22: 43: 02,298 minuterie réinitialisation
2010-05-19 22: 43: 05,399 timer suppression

Comme vous pouvez le voir le délai entre le dernier et le second derniers événements auraient dû être plus que suffisant pour l'appel du sélecteur retardé à exécuter.

Si je remplace performSelector withObject: withDelay à l'ancienne plaine performSelector: Je reçois ceci:

2010-05-19 23: 08: 30,333 minuterie réinitialisation
2010-05-19 23: 08: 30,333 Position verrouillé
2010-05-19 23: 08: 30,366 minuterie réinitialisation
2010-05-19 23: 08: 30,367 position verrouillée
2010-05-19 23: 08: 30,688 timer suppression

qui n » t ce que je veux, mais sert à montrer que c'est seulement le retard qui le cause de ne pas fonc tion, pas quelque chose à faire avec le sélecteur ne pas être déclaré dans l'en-tête, être mal orthographié ou toute autre raison.

Des idées pour expliquer pourquoi cela ne fonctionne pas?

Répondre

19

Je pense que les événements de minuterie sont ignorés pendant le suivi (lorsqu'un doigt est abaissé pour faire défiler ou zoomer). Vous devrez peut-être exécuter le sélecteur dans un autre mode (voir [NSObject performSelector:withObject:afterDelay:inModes:]). Plus précisément, essayez d'utiliser la constante NSRunLoopCommonModes pour le mode.

+0

On dirait que vous avez un point. Je me demande pourquoi ces événements sont ignorés. Est-ce un choix de conception? Y a-t-il de la documentation à ce sujet? – erkanyildiz

+0

Vous avez absolument raison. Cela m'a rendu fou ...! –

3

Juste pour ajouter sur ce que Brian a dit - voici ma mise en œuvre de sa réponse:

[self performSelector:@selector(callMethod) withObject:0 afterDelay:1.0 inModes:@[NSRunLoopCommonModes]]; 

Remarque - inModes: prend un tableau de modes.

Questions connexes