Cómo desplazar un UIScrollView a la carga cuando se usa la function de layout automático.

Tengo un UIScrollView que está configurado en el método viewDidLoad de un UIViewController (lo llamaré ScrollViewController ). La vista de desplazamiento contiene páginas de contenido horizontal (similar a la aplicación de clima nativa).

Al mostrar la vista de desplazamiento, debería ser posible elegir en qué página se inicia. Mi patrón es este:

  • inicie ScrollViewController . No pasa mucho aquí. Una propiedad currentPage es pnetworkingeterminada a 0.
  • configure scrollViewController.currentPage en el número de página deseado.
  • en viewDidLoad de ScrollViewController , lea self.currentPage y use scrollToRect o setContentOffset para desplazarse en consecuencia.

La implementación de desplazamiento parece estar bien, ya que estoy usando el mismo código en otro lugar para saltar a ciertas páginas. Pero en la primera carga, no ocurre nada (es decir, la vista de desplazamiento no se desplaza a la página deseada).

Creo que he encontrado la razón: parece que el contentSize de la vista de desplazamiento (que se deriva por autolayout remember) es 0 durante viewDidLoad , y esto parece que esto evita el desplazamiento. También es cero durante viewWillAppear. Solo en viewDidAppear funciona el desplazamiento, lo que, por supuesto, hace que la experiencia del usuario sea impar.

¿Cómo puedo resolver esto? ¿Es sabio forzar de alguna manera un layout en viewDidLoad ? ¿O algún otro enfoque?

viewDidLayoutSubviews es lo que está buscando. Este es el método donde todos los frameworks de subvistas se inicializan completamente. Por lo tanto, intente llamar al método de configuration de scrollView dentro de él, en su viewController:

 -(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self setupView]; } 

Debería poder configurar manualmente el tamaño de contenido. ¿Dónde insertas las páginas dentro de la vista de desplazamiento? Sugiero insertlos dentro de viewDidLoad o viewWillAppear y luego desplazarse a la página deseada justo después de insertlos configurando su contentOffset .