iphone objective-c uitableview ios7

iphone - La vista de tabla iOS 7 no puede ajustar automáticamente la inserción de contenido



objective-c uitableview (7)

@Christopher Pickslay solución en Swift 2 :

override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let topInset = topLayoutGuide.length inTableView.contentInset.top = topInset inTableView.contentOffset.y = -topInset inTableView.scrollIndicatorInsets.top = topInset }

Estoy transitando mi proyecto a iOS7. Me enfrenta a un problema extraño relacionado con la barra de navegación translúcida.

Tengo un controlador de vista y tiene una vista de tabla como subvista (llamémosle ControllerA). Inicié un nuevo controlador de navegación con el controlador A y lo presento de manera modal usando el controlador de vista actual. La vista de tabla del controlador de visualización presentada está bloqueada por la barra de navegación. Establecí automáticamente AdjustsScrollViewInsets en SÍ, pero el resultado no cambió. Sabía que podía establecer los bordes de ForExtendedLayout en UIRectEdgeNone , pero la barra de navegación no sería más translúcida.

Después de eso, intenté crear un nuevo controlador de vista para probar. Contiene casi los mismos elementos. Pero el resultado es muy diferente. El contenido de la vista de tabla no se bloquea.

Conclusión

  1. Controladores de dos vistas ''automaticallyAdjustsScrollViewInsets establecidos en SÍ
  2. El proyecto no usa guiones gráficos
  3. El primero se crea en Xcode 4.6, el segundo se crea en Xcode 5
  4. He comparado dos clases xib y código, no muy diferente

En función de la respuesta de Tony, pude solucionar este problema programáticamente al enviar temporalmente la vista de tabla a la parte posterior, dejar que se realicen los ajustes y luego enviar la vista de fondo a la parte posterior. En mi caso, no hay ningún parpadeo en este enfoque.

En el controlador de vista:

- (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [self.view sendSubviewToBack:self.tableView]; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self.view sendSubviewToBack:self.backgroundView]; }

Obviamente, si hay otras subvistas en self.view es posible que deba volver a ordenarlas también.


Encontré la respuesta en el foro de desarrolladores de Apple. Hay dos casos diferentes.

El primero, el controlador de vista agregado es UITableViewController. Y el problema no debería aparecer, ya que Apple lo rellenará automáticamente.

El segundo, el controlador de vista NO es un UITableViewController. Y en la jerarquía de vista, contiene una UITableView. En este caso, si UITableview (o ScrollView) es la vista principal de viewController o la primera subvista de la vista principal, funcionará. De lo contrario, el controlador de vista no sabe qué vista de desplazamiento se rellenará y ocurrirá el problema.

En mi caso, el controlador de vista es el segundo. Y hay una vista de la imagen de fondo como la primera subvista de la vista principal. Entonces, falla.

Aquí está el enlace del foro de desarrolladores de Apple (necesita acceder a la cuenta de desarrollador): https://devforums.apple.com/message/900138#900138


Probablemente ya haya demasiadas respuestas, pero tuve que tomar la solución de Christopher y modificarla ligeramente para admitir el cambio de tamaño de la vista y permitir que se cambie la inserción del contenido en una subclase del UIViewController .

@interface MyViewController () @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; @property (assign, nonatomic) UIEdgeInsets scrollViewInitialContentInset; @end @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; [self setScrollViewInitialContentInset:UIEdgeInsetsZero]; } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; if (UIEdgeInsetsEqualToEdgeInsets([self scrollViewInitialContentInset], UIEdgeInsetsZero)) { [self setScrollViewInitialContentInset:[self.scrollView contentInset]]; } } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; UIEdgeInsets scrollViewInset = [self scrollViewInitialContentInset]; if (UIEdgeInsetsEqualToEdgeInsets(scrollViewInset, UIEdgeInsetsZero) { if ([self respondsToSelector:@selector(topLayoutGuide)]) { scrollViewInset.top = [self.topLayoutGuide length]; } if ([self respondsToSelector:@selector(bottomLayoutGuide)]) { scrollViewInset.bottom = [self.bottomLayoutGuide length]; } [self.scrollView setContentInset:scrollViewInset]; } } @end

Para explicar el punto:

Cualquier subclase de MyViewController ahora puede modificar el contentInset de scrollView en viewDidLoad y será respetado. Sin embargo, si el contentInset de scrollView es UIEdgeInsetsZero : se expandirá a topLayoutGuide y bottomLayoutGuide .


Sí, un poco molesto.

Tengo un plumín con una sola vista de tabla dentro de la vista principal, sin utilizar el diseño automático. Hay una barra de pestañas, barra de navegación y una barra de estado, y la aplicación necesita volver a trabajar con 5.0. En el constructor de Interface, funciona bien ''verlo en iOS7 e iOS6.1 uno al lado del otro'', mostrando las tablas perfectamente ajustadas (una vez que los deltas de iOS6 / 7 se configuraron correctamente).

Sin embargo, ejecutándose en un dispositivo o simulador, había una gran brecha en la parte superior de la tabla, que era como resultado de un recuadro de contenido (que coincidía bastante con el delta vertical iOS6 / 7) que se estableció en cero en el plumín.

La única solución que obtuve fue en vista de que WillAppear colocaría [_tableView setContentInset: UIEdgeInsetsZero].

Otro truco feo con un bonito resultado en la pantalla .....


Si desea que la vista se asocie con la barra de navegación, pero también quiere colocarla de manera que la parte superior del contenido de la vista deslizante se coloque debajo de la barra de navegación de forma predeterminada, puede agregar una inserción superior una vez que se haya configurado la vista. Esto es esencialmente lo que hace el sistema de diseño de vista cuando la vista de nivel superior es una vista de desplazamiento.

-(void)viewDidLayoutSubviews { if ([self respondsToSelector:@selector(topLayoutGuide)]) { UIEdgeInsets currentInsets = self.scrollView.contentInset; self.scrollView.contentInset = (UIEdgeInsets){ .top = self.topLayoutGuide.length, .bottom = currentInsets.bottom, .left = currentInsets.left, .right = currentInsets.right }; } }


[self.navigationController setNavigationBarHidden:YES animated:YES];

en:

- (void)viewDidLoad