UIScrollView ajusta contentOffset cuando cambios en contentSize
scrollview ios (7)
Estoy ajustando el estado de un controlador de vista detallada, justo antes de presionarlo en un control de navigationController
:
[self.detailViewController detailsForObject:someObject];
[self.navigationController pushViewController:self.detailViewController
animated:YES];
En DetailViewController, reside un scrollView. Qué contenido cambio de tamaño en función del objeto 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 esto funciona, pero scrollView ajusta su contenido contentOffset
durante la animación de deslizamiento del contentOffset
navegación. contentOffset
se establecerá en 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 alguna ubicación no deseada. Aunque configuro contentOffset
para CGPointZero
explícitamente.
Descubrí que restablecer contentOffset
en - viewWillAppear
no tiene ningún efecto. Lo mejor que se me ocurre es restablecer el contentOffset en viewDidAppear
, lo que provoca un movimiento ascendente y descendente notable del contenido:
- (void)viewDidAppear:(BOOL)animated {
self.scrollView.contentOffset = CGPointZero;
}
¿Hay alguna manera de evitar que UIScrollView
contentOffset
su contentOffset
cuando se contentOffset
su contentOffset
?
¿Tu scrollView es la vista raíz del DetailViewController? En caso afirmativo, intente ajustar el scrollView en una UIView
simple y haga que la última sea la vista raíz de DetailViewController. Como UIView
s no tiene una propiedad contentOffset
, son inmunes a los ajustes de compensación de contenido realizados por el controlador de navegación (debido a la barra de navegación, etc.).
Estaba experimentando un problema similar, donde UIKit estaba configurando el contentOffset de mi scrollView durante las animaciones push.
Ninguna de estas soluciones me funcionaba, tal vez porque tenía soporte para iOS 10 y iOS 11.
Pude solucionar mi problema subclasificando mi vista de desplazamiento para evitar que UIKit cambie mis desplazamientos después de que la vista de desplazamiento se haya eliminado de la ventana:
/// A Scrollview that only allows the contentOffset to change while it is in the window hierarchy. This can keep UIKit from resetting the `contentOffset` during transitions, etc.
class LockingScrollView: UIScrollView {
override var contentOffset: CGPoint {
get {
return super.contentOffset
}
set {
if window != nil {
super.contentOffset = newValue
}
}
}
}
Experimenté el problema, y para un caso específico, no ajusto 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.
La causa de este problema sigue sin estar clara, aunque he encontrado una solución. Al restablecer el tamaño del 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;
}
Se produce al presionar un UIViewController
contiene un UIScrollView
utilizando un UINavigationController
.
ios 7
Solución 1 (Código)
Establecer @property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets
a NO
.
Solución 2 (Storyboard)
Desmarque la Adjust Scroll View Insets
ios 6
Solución (Código)
Establezca la propiedad UIScrollView
contentOffset
y contentInset
en viewWillLayoutSubviews
. Código de muestra:
- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
self.scrollView.contentOffset = CGPointZero;
self.scrollView.contentInset = UIEdgeInsetsZero;
}
Tuve el mismo problema con un UIScrollview, donde el problema fue causado por no configurar el contentSize. Después de configurar el contentSize para la cantidad de elementos, se resolvió este problema.
self.headerScrollView.mainScrollview.contentSize = CGSizeMake(320 * self.sortedMaterial.count, 0);