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
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.