UIScrollView ajusta contentOffset cuando el contenido cambia

Estoy ajustando el estado de un controller de vista de detalle, justo antes de que se presione en un control de navigationController :

 [self.detailViewController detailsForObject:someObject]; [self.navigationController pushViewController:self.detailViewController animated:YES]; 

En el DetailViewController un scrollView. Qué contenido cambio el tamaño según el object pasado:

 - (void)detailsForObject:(id)someObject { // set some textView's content here self.contentView.frame = <rect with new calculated size>; self.scrollView.contentSize = self.contentView.frame.size; self.scrollView.contentOffset = CGPointZero; } 

Ahora, todo funciona, pero el scrollView ajusta su contenido de contentOffset durante la animation deslizante de navigation del contentOffset . El contentOffset se configurará con la diferencia entre el último contentSize y el nuevo calculado. Esto significa que la segunda vez que abra DetailsView, los detalles se desplazarán a una location no deseada. Aunque estoy configurando contentOffset a CGPointZero explícitamente.

Encontré que restablecer el contentOffset la contentOffset in - viewWillAppear no tiene ningún efecto. Lo mejor que podría llegar a hacer es restablecer el contenido del juego en viewDidAppear , causando un notable movimiento hacia arriba y hacia abajo del contenido:

 - (void)viewDidAppear:(BOOL)animated { self.scrollView.contentOffset = CGPointZero; } 

¿Hay alguna forma de evitar que un UIScrollView ajuste su contentOffset cuando se cambia su contentSize ?

    Se produce al presionar un UIViewController contiene un UIScrollView utilizando un UINavigationController .

    iOS7

    Solución 1 (Código)

    Establezca @property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets a NO .

    Solución 2 (Storyboard)

    Desactive la Adjust Scroll View Insets

    Ajustar recuadros de vista de desplazamiento

    iOS 6

    Solución (código)

    Establezca la propiedad UIScrollView 's contentOffset y contentInset en viewWillLayoutSubviews . Código de muestra:

     - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; self.scrollView.contentOffset = CGPointZero; self.scrollView.contentInset = UIEdgeInsetsZero; } 

    La causa de este problema sigue sin estar clara, aunque he encontrado una solución. Al restablecer el tamaño de contenido y el desplazamiento antes de ajustarlos, UIScrollView no se animará:

     - (void)detailsForObject:(id)someObject { // These 2 lines solve the issue: self.scrollView.contentSize = CGSizeZero; self.scrollView.contentOffset = CGPointZero; // set some textView's content here self.contentView.frame = <rect with new calculated size>; self.scrollView.contentSize = self.contentView.frame.size; self.scrollView.contentOffset = CGPointZero; } 

    Tuve el mismo problema con un UIScrollview, donde el problema se debió a que no establecía contentSize. Después de configurar contentSize para la cantidad de elementos, se resolvió este problema.

     self.headerScrollView.mainScrollview.contentSize = CGSizeMake(320 * self.sortedMaterial.count, 0); 

    ¿Su scrollView es la vista raíz del DetailViewController? En caso afirmativo, intente envolver el scrollView en una UIView simple y hacer de esta última la vista raíz de DetailViewController. Dado que UIView no tienen una propiedad contentOffset , son inmunes a los ajustes de desplazamiento de contenido realizados por el controller de navigation (debido a la barra de navigation, etc.).

    Experimenté el problema y, para un caso específico, no ajusté el tamaño, utilicé lo siguiente:

     float position = 100.0;//for example SmallScroll.center = CGPointMake(position + SmallScroll.frame.size.width / 2.0, SmallScroll.center.y); 

    Lo mismo funcionaría con y: anotherPosition + SmallScroll.frame.size.height / 2.0

    Entonces, si no necesita cambiar el tamaño, esta es una solución rápida e indolora.