Recientemente he migrado un código al nuevo SDK de iOS 11 beta 5.
Ahora obtengo un comportamiento muy confuso de UITableView. La vista de tabla en sí no es tan elegante. Tengo celdas personalizadas, pero en su mayor parte es solo por su altura.
Cuando presiono mi controlador de vista con vista de tabla, obtengo una animación adicional donde las celdas "se desplazan hacia arriba" (o posiblemente se cambia todo el marco de vista de tabla) y hacia abajo a lo largo de la animación de navegación push / pop. Por favor ver gif:
Creo manualmente tableview
en el loadView
método y configuro restricciones de diseño automático para que sean iguales a la vista inicial, final, superior e inferior de la vista de tabla. La supervista es la vista raíz del controlador de vista.
Ver el código de inserción del controlador es muy estándar: self.navigationController?.pushViewController(notifVC, animated: true)
El mismo código proporciona un comportamiento normal en iOS 10.
¿Podrías indicarme qué está mal?
EDITAR: He hecho un controlador de vista de tabla muy simple y puedo reproducir el mismo comportamiento allí. Código:
class VerySimpleTableViewController : UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = String(indexPath.row)
cell.accessoryType = .disclosureIndicator
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let vc = VerySimpleTableViewController.init(style: .grouped)
self.navigationController?.pushViewController(vc, animated: true)
}
}
EDICIÓN 2: Pude limitar el problema a mi personalización de UINavigationBar. Tengo una personalización como esta:
rootNavController.navigationBar.setBackgroundImage(createFilledImage(withColor: .white, size: 1), for: .default)
donde createFilledImage
crea una imagen cuadrada con un tamaño y color determinados.
Si comento esta línea, recupero el comportamiento normal.
Agradecería cualquier comentario sobre este asunto.
navigationBar.isTranslucent
afalse
, si no funciona bien.Respuestas:
Esto se debe a
UIScrollView's
(UITableView es una subclase de UIScrollview) nuevacontentInsetAdjustmentBehavior
propiedad, que está configurada en.automatic
forma predeterminada.Puede anular este comportamiento con el siguiente fragmento en viewDidLoad de cualquier controlador afectado:
https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior
fuente
tableView.contentInsetAdjustmentBehavior
rompería las inserciones.contentInsetAdjustmentBehavior
to.never
no es una gran solución porque probablemente tendrá otros efectos secundarios indeseables. Si usa una solución alternativa, debe asegurarse de eliminarla para las versiones de iOS> = 11.2.Además de la respuesta de Maggy
C OBJETIVO
fuente
Puede editar este comportamiento a la vez en toda la aplicación utilizando NSProxy en, por ejemplo, didFinishLaunchingWithOptions:
fuente
Así es como logré solucionar este problema al tiempo que permitía que iOS 11 estableciera inserciones automáticamente . Estoy usando
UITableViewController
.tableView.insetsContentViewsToSafeArea = true
) - Puede que esto no sea necesario, pero es lo que hice.tableView.contentInsetAdjustmentBehavior = .scrollableAxes
);.always
también podría funcionar, pero no lo probé.Otra cosa para probar si todo lo demás falla:
viewSafeAreaInsetsDidChange
UIViewController
Método de anulación para que la vista de tabla fuerce el establecimiento de las inserciones de la vista de desplazamiento en las inserciones del área segura. Esto está en conjunto con la configuración 'Nunca' en la respuesta de Maggy.Nota:
self.tableView
yself.view
debería ser lo mismo paraUITableViewController
fuente
Esto parece más un error que un comportamiento previsto. Ocurre cuando la barra de navegación no es translúcida o cuando se establece una imagen de fondo.
Si solo configura contentInsetAdjustmentBehavior en .never, las inserciones de contenido no se configurarán correctamente en el iPhone X, por ejemplo, el contenido iría al área inferior, debajo de las barras de desplazamiento.
Es necesario hacer dos cosas:
1. evitar que scrollView se anime hacia arriba en push / pop
2. mantener el comportamiento .automatic porque es necesario para iPhone X. Sin esto, por ejemplo, en vertical, el contenido irá por debajo de la barra de desplazamiento inferior.
Nueva solución simple: en XIB: simplemente agregue una nueva UIView en la parte superior de su vista principal con la parte superior, anterior y posterior a la supervista y la altura configurada en 0. No tiene que conectarlo a otras subvistas ni nada.
Solución antigua:
Nota: Si está utilizando UIScrollView en modo horizontal, todavía no establece las inserciones horizontales correctamente (¿otro error?), Por lo que debe anclar el avance / final de scrollView a safeAreaInsets en IB.
Nota 2: La solución a continuación también tiene el problema de que si tableView se desplaza hacia la parte inferior, y presiona el controlador y vuelve a aparecer, ya no estará en la parte inferior.
fuente
Puedo reproducir el error para iOS 11.1 pero parece que el error está corregido desde iOS 11.2. Ver http://openradar.appspot.com/34465226
fuente
asegúrese de que junto con el código anterior, agregue código adicional de la siguiente manera. Resolvió el problema
fuente
Además, si usa la barra de pestañas, la inserción de contenido inferior de la vista de colección será cero. Para esto, ponga el siguiente código en viewDidAppear:
fuente
En mi caso, esto funcionó (póngalo en viewDidLoad):
fuente
Eliminar espacio adicional en la parte superior
collectionView
otableView
Encima del código
collectionView
otableView
debajo de la barra de navegación.El siguiente código evita que la vista de colección vaya debajo de la navegación
pero me encanta usar la lógica y el código siguientes para UICollectionView
La mejor forma para UICollectionView
fuente
Eliminar este código funciona para mí
fuente
Estaba usando UISearchController con resultsControllers personalizados que tienen vista de tabla. La inserción de un nuevo controlador en el controlador de resultados hizo que tableview pasara a buscar.
El código enumerado anteriormente solucionó totalmente el problema
fuente