iOS 7-NavigationController está configurando el contentInset y contentOffset de mi UIScrollView


Tengo un UIScrollView (en realidad un UICollectionView, pero eso probablemente no importa). Cuando aparece en IOS 7, el controlador de navegación establece su contentInset y contentOffset a los valores que no quiero. Parece estar tratando de ajustar la barra de estado y la barra de navegación. Preferiría dejarlos solos. He solucionado esto 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?

Author: William Jockusch, 2013-09-20

7 answers

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

Esto se introdujo en iOS 7, por lo que es posible que desee envolverlo con una verificación de la versión de iOS, si está soportando iOS 6 y abajo.


Update

Si está utilizando guiones gráficos, puede hacerlo en el Creador de interfaces, así como marcando 'Adjust Scroll View Insets' para el controlador seleccionado.

introduzca la descripción de la imagen aquí

 208
Author: KDaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-08 02:24:21

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

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

Fue el primer control en la vista padre así:

antes

Moví la vista de tabla justo después de la vista de imagen y trabajado:

despues

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.

P. D. No estoy usando diseño automático ni guiones gráficos

Espero que esto pueda ayudar a alguien!

 25
Author: Chuy47,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-11 19:33:26

Tengo dos soluciones:

1.

self.view = scrollView;

2.

[self.navigationController.toolbar setTranslucent:NO];
 5
Author: amazingthere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-27 08:19:14

Estoy teniendo el mismo problema.

  1. El ajuste self.automaticallyAdjustsScrollViewInsets = NO resolvió el problema para algunas de las vistas, pero no en todas partes.

  2. La segunda solución es establecer el desplazamiento de contenido 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;
        }
    }
    
 2
Author: Savvy iPhone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-25 09:02:24

Esto es suficiente

- (void)viewDidLoad {

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;
 0
Author: Vlad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-22 17:00:12

Esto soluciona el problema en ambos casos cuando:

  1. Mostrando la 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)
        }
    }
    
 0
Author: Carlos Javier A. Helguero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-04 18:34:48

Las otras respuestas pueden funcionar para ti, pero no funcionaron para mí. Lo que funcionó para mí fue establecer manualmente la propiedad y de la 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 hija que a veces obtenía el contentOffset ajustado y otras veces no. La forma en que me normalizado fue precisamente ajustar manualmente cada vez. Quería que el contenido se desplazara por debajo de la barra de estado, así que usé la altura de la barra de estado como valor (negativo porque quiero el contenido a ser empujado hacia abajo).

 0
Author: Eric F.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 14:51:26