2010-05-19 9 views
8

Siento que debería saber esto pero he estado perplejo durante horas y me han quedado sin ideas.performSelector: withObject: afterDelay: no funciona desde scrollViewDidZoom

La teoría es simple, el usuario manipula el zoom y el posicionamiento en una vista de desplazamiento usando una pizca. Si mantienen esa posición durante un corto período de tiempo, la vista de desplazamiento registra el nivel de zoom y las compensaciones de contenido.

Así que pensé en comenzar un performSelector: withObject: withDelay en el método de delegado scrollViewDidZoom. Si caduca, entonces registro la configuración. Borro la llamada programada cada vez que se llama a scrollViewDidZoom y cuando termina el gesto de pellizco.

Esto es lo que tengo:

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

Ésta es la salida:

2010-05-19 22: 43: 01,931 restablecer temporizador
2010-05-19 22: 43: 01,964 restablecer el temporizador
2010-05-19 22: 43: 02,231 restablecer temporizador
2010-05-19 22: 43: 02,253 restablecer temporizador
2010-05-19 22: 43: 02,269 restablecer temporizador
2010-05-19 22: 43: 02,298 restablecer temporizador
2010-05-19 22: 43: 05,399 borrar temporizador

Como se puede ver el tiempo transcurrido entre la última y la penúltima eventos debería haber sido más que suficiente para la llamada del selector demorado para ejecutar.

Si sustituyo performSelector: withObject: withDelay con el viejo performSelector claro: me sale esto:

2010-05-19 23: 08: 30.333 restablecer temporizador
2010-05-19 23: 08: 30,333 posición bloqueada
2010-05-19 23: 08: 30.366 restablecer temporizador
2010-05-19 23: 08: 30,367 posición de bloqueo
2010-05-19 23: 08: 30.688 borrar temporizador

Qué iSN' Lo que quiero, pero sirve para mostrar que es solo la demora lo que causa que no funcione. ción, no tiene nada que ver con que el selector no se declare en el encabezado, por error o por cualquier otra razón.

¿Alguna idea de por qué no está funcionando?

Respuesta

19

Creo que los eventos del temporizador se ignoran durante el seguimiento (cuando un dedo está hacia abajo para desplazarse o acercarse). Es posible que deba realizar el selector en un modo diferente (consulte [NSObject performSelector:withObject:afterDelay:inModes:]). Específicamente, intente usar la constante NSRunLoopCommonModes para el modo.

+0

parece que tienes un punto. Me pregunto por qué esos eventos son ignorados. ¿Es esta una opción de diseño? hay alguna documentación sobre esto? – erkanyildiz

+0

Tienes toda la razón. Eso me ha estado volviendo loco ...! –

3

sólo para añadir a lo que dijo Brian - aquí está mi aplicación de su respuesta:

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

Nota - inModes: tiene una gran variedad de modos.

Cuestiones relacionadas