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?
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
Hai assolutamente ragione. Questo mi ha fatto impazzire ..! –