2009-09-18 50 views
54

He usado UIScrollView antes, y lo estoy usando ahora, y nunca he tenido un problema. Ahora lo estoy agregando a una aplicación anterior, y aunque funciona como se esperaba (puedo mirar el contenido, desplazarme con el dedo, todos los límites y tamaños están configurados correctamente, por lo que no hay espacio vacío en el contenido, etc. .), Simplemente no puedo hacer que scrollToRectVisible funcione. Incluso he simplificado la llamada de modo que sólo se mueve a la posición de 0,0:UIScrollView funciona como se esperaba, pero scrollRectToVisible: no hace nada

[scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES]; 

o moverlo a 0200:

[scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES]; 

Incluso me hizo una aplicación rápida de probar esto y puedo obtener scrollRectToVisible para trabajar allí como yo esperaba. Pero en mi aplicación anterior, parece que no puedo hacer nada.

Puedo hacer que scrollView se desplace con setContentOffset:, pero eso no es lo que quiero.

Este scrollView y su contenido están definidos en el plumín por IB y se usan con un IBOutlet. El único código que estoy utilizando en mi aplicación para manejar la ScrollView es

[scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)]; 

(sólo estoy interesado en desplazamiento vertical no horizontal).

¿Alguien ha tenido un problema como este?

He comparado los atributos scrollView en ambas aplicaciones y son idénticos.

Adición:

mi cuerpo scrollViews es: 0.000000 0.000000 480.000000 179.000000

Mi scrollViews contentSize es: 0.000000 324.000000

Todavía actúa como el rect quiero para desplazarse hasta ya es visible y no hay se necesita desplazamiento. No estoy seguro de si eso es lo que está sucediendo. Esto es solo lo más desagradable. Parece que una cosa tan fácil de resolver ...

ADDENDUM # 2:

Así es como yo estoy haciendo prescindir scrollRectToVisible:

CGPoint point = myRect.origin; 
if (![clefScrollView pointInside:point withEvent:nil]) { 
    point.x = 0; 
    if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height) 
     point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height; 
    [clefScrollView setContentOffset:point animated: YES]; 
} 

Todo lo demás de este ScrollView funciona como se esperaba, pero scrollRectToVisible. ¿¡¿POR QUÉ?!? ¿Alguna suposición salvaje?

Respuesta

99

Más de un mes después, y finalmente lo descubrí. Si bien la alternativa anterior funcionó bien, me ha estado molestando y finalmente tuve que resolverlo. Resulta que fue un error algo estúpido.

Aquí está el código antiguo en mi viewDidLoad, donde me juego hasta la ScrollView:

[clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)]; 

El valor de una altura o anchura ScrollView no puede ser 0!Creo que esto me pasó porque estaba asumiendo que los tamaños de ScrollView comienzan con un tamaño válido, ¡y me faltaba el hecho de que una dimensión era cero!

Esto funciona:

[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)]; 

Espero que esto ayude a alguien por ahí. Definitivamente, pasé demasiado tiempo intentando depurar esto.

+0

¡Gracias! También me tocó un poco (estaba configurando la altura pero no el ancho). –

+3

Esto no es del todo correcto - c.f. La respuesta de Orion a continuación (tenía un ancho/alto distinto de cero, no es '0' el que causa el problema ...) – Adam

+0

He hecho esto de manera similar pero aún scrollRectToVisible no funciona. Está trabajando en el simulador pero no en el dispositivo. Por favor ayuda. –

43

Sí, no he tenido éxito con scrollRectToVisible:animated:, pero setContentOffset:animated: siempre me funciona. Por curiosidad, ¿por qué no quieres usar setContentOffset:animated:? Parece ser la solución adecuada.

+3

Desafortunadamente, setContentOffset se desplazará al punto, independientemente de si ya está visible o no. Podría hacer un trabajo extra para determinar si el punto es visible o no, sin embargo, todavía tengo curiosidad de por qué scrollRectToVisible no funciona, cuando lo veo funcionar en mi propia muestra y otras muestras en la red. Debo estar haciendo algo mal, pero con solo tres o cuatro líneas de código para scrollView, no puedo ver qué? – mahboudz

0

La solución sugerida anterior aún puede dar un error si no ha configurado el marco para el "clefScrollView".

Si se utiliza la solución anterior y sigue teniendo el mismo problema, asegúrese de haber inicializado su marco scollView (en este caso clefScrollView) antes de establecer la vista de contenido.



    clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)]; 

    [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)]; 



1

lo tenía como esto y no funcionó

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue); 

me estaba cambiando la altura de la contentSize, por lo que no pensé que me daría ningún problema, pero lo hizo ...

tuvieron que cambiarlo a este

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue); 

resulta scrollView.contentSize.width no es Necessari Establecer un valor válido desde el principio, así que mejor darle un valor específico

5

Es posible que desee comprobar y ver que la propiedad delaysContentTouches de scrollView se establece en NO.

Si llama al método scrollRectToVisible o setContentOffset desde un toque dentro de una subvista de su scrollView, entonces su scrollView podría estar reteniendo las cosas al retrasar toques.

Por lo tanto, asegúrese de configurar lo siguiente en su scrollView.

scrollView.delaysContentTouches = NO; 

Es muy probable que pueda mover la vista de desplazamiento con y sin animación establecida en SÍ.

0

Llegué un poco tarde al juego pero estaba teniendo el mismo problema. Aunque tenía absolutamente el tamaño de contenido de mi scrollview configurado correctamente, incluso en exceso para el valor de altura. Incluso después de exhaustivas comprobaciones para validar los marcos y el tamaño del contenido, todavía no funcionaba. Tuve que ajustar la altura del cuadro "límites", luego todo funcionó muy bien.

0

Tuve los mismos síntomas que este problema ... el scrollRectToVisible no funcionaba como estaba previsto. Mi problema era que la vista de desplazamiento en el guión gráfico tenía un problema de restricción ambiguo. Una vez que se arregló, la llamada funcionó bien. Otra cosa es verificar cuando la llamada scrollRectToVisible no funciona como se esperaba.

Cuestiones relacionadas