iOS 7 – navigationController está configurando el contentInset y ContentOffset de mi UIScrollView

Tengo un UIScrollView (en realidad un UICollectionView, pero eso probablemente no importe). Cuando aparece en IOS 7, el controlador de navegación establece su contentInset y contentOffset en valores que no quiero. Parece estar intentando ajustar la barra de estado y la barra de navegación. Preferiría mucho que los dejara en paz. Lo he solucionado anulando los métodos getter y setter para contentInset y contentOffset, con un indicador para indicar al objeto si debe aceptar o no un conjunto. Pero hay una manera mejor?

Intente establecer self.automaticallyAdjustsScrollViewInsets = NO en su controlador de vista principal.

Esto se introdujo en iOS 7 por lo que es posible que desee ajustarlo con una verificación de versión de iOS, si es compatible con iOS 6 y iOS 6 posteriores.


Actualizar

Si está usando storyboards, puede hacerlo en el Interface Builder y también puede marcar 'Adjust Scroll View Insets' para su controlador seleccionado.

enter image description here

Tuve un problema similar, después de descartar un ViewController, el contentOffset de mi tableView se cambió a (0, -64).

mi solución fue un poco extraña, probé todas las otras respuestas pero no tuve éxito, lo único que solucionó mi problema fue cambiar la posición tableView en el árbol de controles de .xib

fue el primer control en la Vista padre como este:

antes de

Moví el TableView justo después de ImageView y funcionó:

después

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

PD No estoy usando autoLayout ni guiones gráficos

¡Espero que esto pueda ayudar a alguién!

Tengo dos soluciones:

1.

 self.view = scrollView; 

2.

 [self.navigationController.toolbar setTranslucent:NO]; 

Estoy teniendo el mismo problema.

  1. Establecer self.automaticallyAdjustsScrollViewInsets = NO resolvió el problema para parte de la vista, pero no en todas partes.

  2. La segunda solución es establecer el contenido-offset de tableview / view / scrollview en viewWillLayoutSubviews:

     - (void)viewWillLayoutSubviews { //Arrange the view CGRect tempViewFrame = self.view.frame; if (tempViewFrame.origin.y == 64.0f) { tempViewFrame.origin.y = 0; self.view.frame = tempViewFrame; } } 

Esto es suficiente

 - (void)viewDidLoad { [super viewDidLoad]; self.automaticallyAdjustsScrollViewInsets = NO; 

Esto soluciona el problema en ambos casos cuando:

  1. Mostrando barra de estado
  2. Mostrando barra de estado + barra de navegación

     override func viewDidLayoutSubviews() { NSLog("ORIGIN: \(self.view.frame.origin.y)") if self.view.frame.origin.y == 0 { if let rect = self.navigationController?.navigationBar.frame { let y = rect.size.height + rect.origin.y self.tableView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0) } } else if self.view.frame.origin.y == 44 || self.view.frame.origin.y == 64 { self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) } } 

Las otras respuestas pueden funcionar para usted, pero no funcionaron para mí. Lo que funcionó para mí fue configurar manualmente la propiedad y de contentOffset en viewDidLayoutSubviews y viewWillAppear :

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // Set the offset to go below the status bar collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Set the offset to go below the status bar collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height } 

En mi caso, mi controlador tenía una vista de colección de niños que a veces obtenía el contentOffset del contentOffset ajustado y otras veces no. La forma en que lo normalicé fue simplemente ajustarlo manualmente cada vez. Quería que el contenido se desplazara por debajo de la barra de estado, así que utilicé la altura de la barra de estado como el valor (negativo porque quiero que el contenido se presione).