2009-07-06 13 views
5

Tengo una UITextView que tiene un montón de contenido. Tengo un botón que permite al UITextView para desplazarse de forma automática + 10 píxeles en un bucle NSTimer:Desplazamiento automático de iPhone UITextView, pero también permite el desplazamiento manual

scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 10); 
[textView setContentOffset:scrollPoint animated:YES]; 

Esto funciona muy bien, ya que la animación hace que el desplazamiento más suave. Quiero permitir al usuario saltar hacia adelante o hacia atrás desplazándose con el dedo, sin embargo, debido a este código después de la animación de desplazamiento, el desplazamiento vuelve al lugar donde se habría desplazado automáticamente.

Necesito restablecer la variable scrollPoint después de un desplazamiento manual, pero no estoy seguro de cómo hacerlo. He intentado implementar el método delegado

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; 

pero este método incendios en mi desplazamiento automático también.

¿Alguna idea?

Respuesta

12

Se podía hacer que se mueva con respecto a lo que es:

scrollPoint = textView.contentOffset; 
scrollPoint.y= scrollPoint.y+10; 
[textView setContentOffset:scrollPoint animated:YES]; 
+0

El hombre tenía la cabeza demasiado cerca de este problema. ¡Tu solución funciona maravillosamente! Gracias. –

+0

Se desplaza con suavidad con "animated: NO" – DerWOK

0

Creo que al tener efectivamente 2 maneras para desplazar el contenido de su clase de la lucha contra la API.

Si entiendo correctamente, en su configuración actual tiene un botón que dispara una animación.

Cuando se desplaza de esta manera, se crea una animación y se ejecuta en otro hilo. Mientras la animación se está ejecutando, la capa de presentación está siendo modificada. Sin embargo, el desplazamiento de contenido real es NO establecido hasta que finalice la animación.

Esto funciona bien y de forma transparente, hasta intenta animar la misma propiedad mientras se está animando.

Normalmente, en este caso cancela las animaciones existentes, establece el marco en la capa de presentación (posición actual en pantalla) y luego aplica la nueva animación.

Sin embargo, está utilizando un método conveniente de textView (setContentOffset: animated :). Cuando haces esto, pierdes el control de la animación fina, a cambio de menos líneas de código.

Creo que detener un desplazamiento en progreso puede ser difícil o imposible con las API de nivel superior. Esto significa que debes hacer lo que quieras, al menos tendrás que probar un bloque de animación UIView y probablemente crearás una CAAnimation.

La solución más fácil es establecer un medio para desplazarse por su textView. El HIG favorece el uso de la manipulación directa en el iPhone. Incluso si es fácil realizar el desplazamiento en ambas direcciones, recomendaría abandonar el método del botón, y simplemente usar la manipulación directa que está implementando ahora.

2

Quería hacer lo mismo que intentas hacer Ben, pero encontré que la animación era demasiado costosa en términos de tiempo de visualización y parecía frustrar el propósito. Jugué con eso y descubrí que el siguiente código hace exactamente lo que quería que hiciera y no empantana el sistema en absoluto.

Configuración

if (autoscrollTimer == nil) { 
    autoscrollTimer = [NSTimer scheduledTimerWithTimeInterval:(35.0/1000.0) 
                target:self 
                selector:@selector(autoscrollTimerFired:) 
                userInfo:nil 
                repeats:YES]; 
} 

la llave está en girando el OFF animación y moviendo el desplazamiento en incrementos más pequeños. Parece funcionar más rápido y no interfiere con el desplazamiento manual.

- (void)autoscrollTimerFired:(NSTimer*)timer { 
    CGPoint scrollPoint = self.textView.contentOffset; 
    scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 1); 
    [self.textView setContentOffset:scrollPoint animated:NO]; 
} 

soy bastante nuevo en Objective-C y el desarrollo iphone así que si alguien con más experiencia ve un problema con este enfoque le agradecería cualquier comentario.

+0

En mi caso, realmente me gustó la animación, pero si solo te mueves en 1 píxel, entonces debería ser suave. Sin embargo, por otras razones, cambié a usar una vista web, que no hereda de la vista de desplazamiento, así que tuve que usar Javascript para hacer el desplazamiento. Yuck. Fue un poco entrecortado, pero valió la pena. –

Cuestiones relacionadas