custom - iOS 11 gran barra de navegación título velocidad inesperada
swift uisearchbar (5)
Estoy intentando implementar el título de la barra de navegación grande nativa de iOS 11 en mi nueva aplicación. Al llamar a las siguientes funciones en viewDidLoad ():
navigationController?.navigationBar.prefersLargeTitles = true
navigationController?.navigationItem.largeTitleDisplayMode = .always
Pero, cuando comienzo a desplazarme hacia arriba (la única vista dentro de la vista principal es una vista de desplazamiento), el desplazamiento hace que el título grande desaparezca a una velocidad más rápida que el desplazamiento real con el dedo. (es decir, si muevo 2 cm en la pantalla, la vista de desplazamiento en realidad se desplaza más de 2 cm, hasta que el título grande se reduce al tamaño "habitual").
El siguiente es el gif de mi aplicación que se está desplazando. De hecho, me muevo muy poco, y se desplaza automáticamente hacia arriba. Esto difiere de las aplicaciones hechas por Apple (la tienda de aplicaciones, por ejemplo, que se muestra debajo de mi aplicación).
¿Alguien tiene solución para resolver este comportamiento anormal?
EDITAR: Por solicitud, estoy agregando la jerarquía de vista actual. No hay nada especial en mi código, solo establezco el título y la bandera para prefersLargeTitles
.
Descubrí que esto sucede cuando la barra de navegación tiene títulos grandes y no es translúcida . Si está utilizando un CollectionView o TableView, y está restringido al área segura o su supervisión, entonces debe manejar las inserciones por usted.
Para las vistas de desplazamiento, consulte los documentos de Apple, hay algunas variables nuevas (como contentInsetAdjustmentBehavior ) para los cambios de área segura que se introdujeron en iOS 11: https://developer.apple.com/documentation/uikit/uiscrollview
Para hacer la barra de navegación translúcida
En viewDidLoad (), intente agregar:
navigationController?.navigationBar.isTranslucent = true
O establezca esta marca de verificación en IB:
El problema en el caso de la velocidad doble puede ser que su tamaño de vista sea más pequeño que el tamaño de vista del controlador de navegación y que tenga una jerarquía de vista similar (puede verificarlo en el depurador de vista)
V:|-[navbar]-[view]-|
por lo tanto, cuando se desplaza el marco de su vista cambia durante el cambio de desplazamiento de contenido y se duplica la velocidad.
extendedLayoutIncludesOpaqueBars = true
debería ayudar.
Encontré este problema también.
En Interface Builder
- Seleccione su "viewController"
- El inspector de atributos marca "Bajo barras opacas" y "Bajo barras superiores"
- Haga que sus restricciones principales de su scrollView segundo elemento a "SuperView" no "SafeArea"
He estado depurando esto por un par de días, y he encontrado una solución.
Primero, ¿qué estaba pasando?
Es el UIScrollView
que no está funcionando bien con largeTitle. Dado que se desplaza hacia arriba en la vista de desplazamiento al mismo tiempo que la barra de navegación se reduce, existe el doble de desplazamiento en comparación con el desplazamiento real.
Confirmé esto estableciendo intencionalmente:
scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
Esto hizo que se moviera como se desea. Pero, esto no pudo resolver el problema por completo porque no produjo una transición suave al pasar de la barra de navegación grande a la barra de navegación pequeña. Puedes probar el siguiente código.
if scrollView.contentOffset.y > 0 {
if self.navigationController!.navigationBar.frame.size.height > 44.0 {
scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
}
}
Esto funcionó ''bien'' cuando se desplaza lentamente, pero cuando se desplaza hacia abajo, al principio actúa lento (mientras que la altura de navegación es grande), y luego se acelera.
Solución de problemas
En pocas palabras, NO PUEDES usar UIScrollView
con la gran barra de navegación de iOS 11. Deberías usar UITableViewController
en UITableViewController
lugar.
Como mi vista se compone de múltiples UICollectionViews
horizontales distribuidas verticalmente, usé UITableView
con diferentes secciones para formar la IU utilizando el guión gráfico. Si utiliza UITableViewController
, se realiza según lo deseado.
AppStore y todas las demás aplicaciones nativas hechas por Apple deben hacerlo de esta manera.
Resolví el problema con estas restricciones:
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
scrollView.leftAnchor.constraint(equalTo: view.leftAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
scrollView.rightAnchor.constraint(equalTo: view.rightAnchor)
])
También debe establecer esta propiedad en su subclase UIViewController:
extendedLayoutIncludesOpaqueBars = YES