El origen de UIScrollView cambia después de aparecer nuevamente en UIViewController

Tengo una subclass UIViewController como una escena en el guión gráfico que contiene una UIScrollView contiene varias subvistas. Una de las subvistas es un UIButton que sigue a otra subclass UIViewController escena. Cuando vuelvo de la vista ( UIViewController el UIViewController fuera de la stack del controller de navigation), me parece que el origen de la vista de desplazamiento ha cambiado de alguna manera, aunque el contentsize y el contentsize parecen correctos.

Lo que también es interesante es que la aplicación tiene una barra de tabs, y cuando veo y retrocedo a esa vista, la vista de desplazamiento se configura correctamente con desplazamiento en (0, 0).

Básicamente, no hay ningún código involucrado en este process, ya que está casi todo en el guión gráfico. Como soy bastante nuevo en el uso del guión gráfico, me imagino que estoy haciendo algo mal, aunque no sé qué. ¿Alguna idea de lo que puede ser? Quizás dimensionando problemas o limitaciones?

En iOS 7/8/9 simple self.automaticallyAdjustsScrollViewInsets = NO; Resolví el problema en mi caso.

Intente esto en vista. Aparecerá el controller de vista al que volverá a aparecer:

  self.scrollView.contentOffset = CGPointMake(0, 0); 

Editar: cuando también agregue el código de Peter obtendrá los mejores resultados con:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; self.scrollView.contentOffset = CGPointMake(0, 0); } 

más

 - (void)viewWillDisappear:(BOOL)animated { self.recentContentOffset = self.scrollView.contentOffset; [super viewWillDisappear:animated]; } 

y

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; self.scrollView.contentOffset = CGPointMake(0, self.recentContentOffset.y); } 

Regresará a la position de desplazamiento original, no tendrá ningún efecto secundario visual y la vista de desplazamiento se colocará correctamente en su supervisión (que fue un problema) después de volver.

En realidad, puse esa línea de código en viewDidDisappear , y para que recuerde el desplazamiento cuando la vista reaparezca, agregué esta línea antes de que

  self.contentOffset = self.scrollView.contentOffset; 

tanto como

  - (void)viewDidLayoutSubviews { self.scrollView.contentOffset = self.contentOffset; } 

Tuve un problema similar, luego de descartar un viewController, se cambió el contenido de My TableView a (0, -64).

mi solución fue un poco rara, probé todas las demás respuestas pero no tuve éxito, lo único que solucionó mi problema fue cambiar la position tableView en el tree de controles del .xib

fue el primer control en la vista principal así:

antes de

Moví la tablaView justo después de ImageView y funcionó:

después

parece que poner la vista de la tabla en la primera position estaba causando el problema, y ​​mover la vista de la tabla a otra position solucionó el problema.

PD No estoy usando autoLayout ni storyboards

¡Espero que esto pueda ayudar a alguien!

Desafortunadamente, las sugerencias de Peter y MacMark no funcionaron para mí (Xcode 5 w / auto-layout). La solución era ir al guión gráfico, seleccionar el controller de visualización y Reset to Suggested Constraints in View Controller el controller de visualización.

introduzca la descripción de la imagen aquí

Estoy usando una colecciónView y tuve un problema similar. Para iOS 11: en el inspector de tamaño, hay "recuadro de contenido". Establezca eso en "Nunca". Eso resolvió el problema para mí. Espero que esto ayude a alguien.

Recientemente publiqué una pregunta sobre un problema similar pero en un context diferente: Frame no refleja restricciones de layout automático después de descartar el controller de vista modal

En mi caso, el origen de una vista de contenedor personalizado dentro de la vista de desplazamiento se desplaza, en lugar del origen de la vista de desplazamiento en sí. Con respecto al layout automático, la vista del contenedor personalizado está fijada a los cuatro lados de la vista de desplazamiento.

La vista de contenedor se crea y se configuró mediante progtwigción en lugar de en IB. Aunque las restricciones de la vista del contenedor no cambian, el origen de la vista del contenedor se desplaza después de descartar un controller de vista modal. Esta desconnection entre restricciones y frameworks es inexplicable.

Lo que es aún más notable es que el problema del desplazamiento de origen se mantuvo después de eliminar y volver a agregar todas las restricciones relacionadas.

Se me ocurrió una solución similar: save el valor para el desplazamiento de contenido actual, establecer el desplazamiento de contenido en "cero", dejar que el sistema cambie tus vistas y luego restaurar el desplazamiento de contenido (es decir, una danza de desplazamiento de contenido).

En mi caso, sin embargo, tuve que tomar medidas adicionales para resolver el problema. Mi vista de desplazamiento es una vista de desplazamiento de pagination que obtiene sus subvenciones de un método tilePages (demostrada en un viejo video WWDC). Cambiar el desplazamiento del contenido de la vista de desplazamiento activa el método tilePages mediante el método scrollViewDidScroll: UIScrollViewDelegate. Tuve que configurar una bandera para desactivar tile Pages mientras hice el baile de compensación de contenido; de lo contrario, la aplicación se bloqueaba.

Con suerte, puedo eliminar el código para la danza de compensación de contenido cuando actualizo a iOS 7.

Continuación Problema al seguir las respuestas actuales:

El segundo bash de abrir el controller de vista presentado, sin haber salido del controller de vista de presentación, permaneció el problema. Es por eso que estoy publicando los pasos exactos que dieron como resultado mi solución.

  1. Por lo tanto, restablezco las restricciones de collectionView en el Storyboard, asegurándome de que quedaron ancladas a la vista principal de ViewController.

  2. Agregado : self.view.translatesAutoresizingMaskIntoConstraints = YES; dentro de viewDidLoad del controller de vista presentadora.

  3. Y almacenado , de forma privada, el contenido Desconfianza de la vista de colección antes de la aparición del controller de vista presentado de manera modal:

     (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; self.contentOffset = self.collectionView.contentOffset; self.collectionView.contentOffset = CGPointZero; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; self.collectionView.contentOffset = self.contentOffset; } 

Recientemente, he encontrado este error, se puede resolver usando estos códigos:

 // fix ios 6 bug begin - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { isReconetworkingforios6 = YES; recordedOffsetforios6 = self.tableView.contentOffset; recordedSizeforios6 = self.tableView.contentSize; } } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if (isReconetworkingforios6) { isReconetworkingforios6 = NO; self.tableView.contentSize = recordedSizeforios6; self.tableView.contentOffset = recordedOffsetforios6; } } // fix ios 6 bug end 

¡Gracias Peter Jacobs!

 - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { _isReconetworkingforios6 = YES; _recordedOffsetforios6 = _scrollView.contentOffset; _recordedSizeforios6 = _scrollView.contentSize; _scrollView.contentOffset = CGPointZero; } } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if (_isReconetworkingforios6) { _isReconetworkingforios6 = NO; _scrollView.contentSize = _recordedSizeforios6; _scrollView.contentOffset = _recordedOffsetforios6; } } 

He corregido este error ios6, se puede resolver utilizando estos códigos. Resolví un error en Scrollview. ¡Gracias sobre todo a mis amigos!

Después de probar muchas cosas:

  • Establezca automáticamenteAjustaScrollViewInsets en falso para ver si el problema era con la barra de navigation.
  • Jugando con alturas de celdas fijas …
  • Caché de las alturas de las celdas …
  • Mantener una propiedad con la compensación de la vista de tabla, almacenarla en caching y configurarla en viewWillAppear …
  • etc

Me di count de que el problema era sobre el valor estimatedRowHeight , que estaba establecido en 50px, cuando debería ser ~ 150px. La actualización del valor solucionó el problema y ahora la vista de tabla mantiene el mismo desplazamiento.

Desactive la opción AutoLayout para ese xib de lo contrario