scrollViewDidScroll se llama cuando se carga la primera página de UIScrollView

Estoy usando Apple Código de muestra de PageControl para el desplazamiento horizontal en el diseño vertical y todo funciona bien, excepto cuando se carga por primera vez UIScrollView, la página inicial que se muestra tiene

 1)  The first page offset by 11 pixels at location (11,0) or
 2)  The second page offset by 19 pixels at location (301,0) or
 3)  The second page offset by 65 pixels at location (255,0) or
 4)  The first page offset by 81 pixels at location (81,0) or...

La estructura general de mi proyecto Xcode es:

UITabBarController -> UITableView -> UIViewController containing UIScrollView

IE, al seleccionar una pestaña en UITabBarController, aparece un UITableView. Al seleccionar una celda en UITableView, aparece una vista con un UIScrollView en ella. El problema de compensación se produce cuando se muestra por primera vez este UIScrollView.

Parece que cuando se carga UIScrollView por primera vez, se llama a scrollViewDidScroll varias veces (¡34!), Mientras que en el código de muestra de PageControl de Apple, no se llama a scrollViewDidScroll cuando se carga por primera vez UIScrollView.

Una vez que se carga UIScrollView, UIScrollView funciona bien y el desplazamiento termina con las páginas en los límites del marco en múltiplos de 320. Mi marco UIScrollview tiene un ancho igual al número de páginas multiplicado por 320. Tengo el UIScrollView dentro de un UIView.

La respuesta a esto post dice que se llama a scrollViewDidScroll cada vez que cambian los límites de desplazamiento, pero por lo que puedo decir, no estoy cambiando los límites de desplazamiento; Mantengo el mismo tamaño de marco para cada uno de los viewControllers que estoy cargando en UIScrollView.

Estoy usando viewDidLoad en lugar de awakeFromNib como en el código de muestra PageControl de Apple. ¿Alguien tiene alguna idea de lo que podría causar:

 A)  scrollViewDidScroll to get called multiple times when UIScrollView first loads?
 B)  why scrollViewDidScroll would end on offsets that are not multiples of 320?
 C)  is the problem that UITableView contains a UIScrollView and so when transitioning
     from UITableVIew to UIScrollView some parameters in the UITableView are being
     used by the UIScrollView?

preguntado el 18 de junio de 11 a las 02:06

3 Respuestas

Los límites de una vista de desplazamiento cambian con cada movimiento de desplazamiento. Los límites son esencialmente el rectángulo visible actualmente en la vista de desplazamiento.

Ejemplo:

marco: {0,0,320.0,480.0} contentSize: {320.0, 1000.0} contentOffset: {0, 100.0}

los límites serán: {0, 100.0, 320.0, 480.0}

Entonces, para cada cambio en contentOffset, los límites cambian. Esto hace que layoutSubviews y didScroll sean llamados continuamente mientras se desplaza.

Respondido el 18 de junio de 11 a las 11:06

El problema que tengo no es con el desplazamiento, que funciona bien y las páginas se ajustan a los límites del marco de múltiplos de 320. El problema es que cuando se carga UIScrollView por primera vez, la primera página se desplaza desde los límites del marco de múltiplos de 320. - James Testa

Bueno, esta es la respuesta a tu primera pregunta. viewDidScroll solo páginas correctamente cuando el desplazamiento está animado. Sin animación, puede configurarlo en cualquier posición y no se moverá a los múltiplos de 320. - Cocoanética

¿Cómo hago que el desplazamiento sea animado? - James Testa

setContentOffset: animado: SÍ - Cocoanética

Encontré la solución. El problema era que en loadScrollViewWithPage estaba agregando ViewController a UIScrollView y luego modificando ViewController. Al mover la adición de ViewController al final de loadScrollViewWithPage después de haber terminado de modificar el controlador, el problema desapareció. Así que moví la siguiente línea al final de loadScrollViewWithPage:

         [self.scrollView addSubview:controller.view];

Respondido el 20 de junio de 11 a las 07:06

Déjame aclararte:

Para A) Así es, scrollViewDidScroll podría llamarse más de 2 veces cuando se carga UIScrollView por primera vez.

Para B) 1: Si termina en compensaciones que no son múltiplos de 320, es posible que haya olvidado o
configurando los marcos y variables de contenido incorrectos, debe hacer lo siguiente:

   myScrollView.contentSize = CGSizeMake(myScrollView.frame.size.width * testArray.count 
   ,myScrollView.frame.size.height/2);

   myScrollView.contentOffset = CGPointMake(0, myScrollView.frame.origin.y);

   2: Then for the custom view you want to add into scrollview, you should set its frame like:
   Customview : CGRectMake(n*myScrollView.frame.size.with, 0, myScrollView.frame.size.with, 
   myScrollView.frame.size.height)];

   That's to say, when the width of custom view is same  with your scrollview, you will get the effect that you want.

Para C) Eso no está bien, olvídalo.

Respondido el 13 de Septiembre de 12 a las 05:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.