ios iphone uiscrollview contentsize

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


Esto es lo que funcionó para mí:
En el guión gráfico, en el Inspector de tamaño para scrollView, establezca el Comportamiento de ajuste de los Incrustos de contenido en "Nunca".


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);