2010-05-19 13 views
8

Mi sento come se dovessi saperlo, ma sono stato bloccato per ore e ora ho esaurito le idee.performSelector: withObject: afterDelay: non funziona da scrollViewDidZoom

La teoria è semplice, l'utente manipola lo zoom e il posizionamento in una scrollview utilizzando un pizzico. Se mantengono quel pizzico per un breve periodo di tempo, la visualizzazione a scorrimento registra il livello di zoom e gli offset del contenuto.

Quindi ho pensato di avviare un oggetto PerformSelector: withObject: withDelay sul metodo scrollViewDidZoom delegate. Se scade, registro le impostazioni. Cancellare la chiamata programmata ogni volta che viene chiamato scrollViewDidZoom e al termine del gesto di pizzicamento.

Questo è quello che ho:

- (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]; 
} 

Questa è l'uscita:

2010-05-19 22: 43: 01,931 reset timer
2010-05-19 22: 43: 01,964 reimpostazione timer
2010-05-19 22: 43: 02,231 reset timer
2010-05-19 22: 43: 02,253 reset timer
2010-05-19 22: 43: 02,269 reset timer
2010-05-19 22: 43: 02,298 resettare il timer
2010-05-19 22: 43: 05,399 eliminazione timer

Come si può vedere il ritardo tra gli ultimi e la seconda ultimi eventi avrebbe dovuto essere più che sufficiente per la chiamata del selettore ritardata da eseguire.

Se sostituisco performSelector: withObject: withDelay con Plain Old performSelector: ottengo questo:

2010-05-19 23: 08: 30,333 resettare il timer
2010-05-19 23: 08: 30,333 posizione bloccato
2010-05-19 23: 08: 30,366 resettare il timer
2010-05-19 23: 08: 30,367 posizione di blocco
2010-05-19 23: 08: 30,688 eliminazione timer

Quale isn' Quello che voglio, ma serve a dimostrare che è solo il ritardo che sta causando a non funzionare non ha nulla a che fare con il selettore che non viene dichiarato nell'intestazione, con errori di stampa o altri motivi.

Qualche idea sul motivo per cui non funziona?

risposta

19

Penso che gli eventi del timer vengano ignorati durante il rilevamento (quando un dito è abbassato per scorrere o ingrandire). Potrebbe essere necessario eseguire il selettore in una modalità diversa (vedere [NSObject performSelector:withObject:afterDelay:inModes:]). In particolare, prova a utilizzare la costante NSRunLoopCommonModes per la modalità.

+0

sembra che tu abbia ottenuto un punto. Mi chiedo perché quegli eventi siano ignorati. è questa una scelta di design? c'è qualche documentazione su questo? – erkanyildiz

+0

Hai assolutamente ragione. Questo mi ha fatto impazzire ..! –

3

Giusto per aggiungere su quello che ha detto Brian - ecco la mia realizzazione della sua risposta:

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

Nota - inModes: prende una serie di modi.

Problemi correlati