UINavigationItem Issue Issue

Estoy teniendo un problema con el post en un UINavigationItem que no puedo resolver …

Tengo un maestro y un controller de vista de detalle. Cuando presiono desde el maestro hasta el detalle se muestra un post en el controller de vista de detalles:

rápido

Sin embargo, cuando return al controller de vista maestra, la vista no cambia de tamaño y la window se muestra (la window se ha coloreado en rojo):

ventana

Esto solo sucede en iOS7, en iOS6, la vista cambia de tamaño según lo esperado.

He intentado algunas cosas, como configurar el prompt a cero en la vista viewWillDisappear o viewDidDisappear pero nada parece solucionarlo.

Si configuro la barra de navigation en el controller de navigation en translúcido, soluciona esto, desafortunadamente, esa no es una opción.

Aquí he creado un pequeño proyecto de ejemplo que demuestra el problema: https://github.com/InsertWittyName/NavigationItemPrompt

¡Gracias de antemano por cualquier ayuda!

Una solución en la que puedo pensar es subclass la UIView del maestro e implementa viewDidMoveToSuperview para configurar el marco de la vista desde la altura de la barra de navigation hasta el final de la supervisión. Como la barra de navigation no es translúcida, su trabajo es más fácil, ya que no tiene que tener en count las guías de layout y las inserciones de contenido.

Algunas cosas para notar. Al presionar y hacer estallar, el sistema mueve la vista del controller de vista a otra vista de supervisión para la animation y luego la regresa a la jerarquía de vista privada del controller de navigation. Además, cuando una vista se sale de la jerarquía de vista, la vista de supervisión se vuelve nil .

Aquí hay una implementación de ejemplo:

 @interface LNView : UIView @end @implementation LNView - (void)viewDidMoveToSuperview { [super viewDidMoveToSuperview]; if(self.superview != nil) { CGRect rect = self.superview.bounds; rect.origin.y += 44; rect.size.height -= 44; [self setFrame:rect]; } } @end 

Esta no es una implementación perfecta porque utiliza un valor codificado para la altura de la barra de navigation, no tiene en count una barra de herramientas posible, etc. Pero todos estos pueden agregarse como properties a esta vista y en viewDidLoad , antes de que comience a entrar en el Ver jerarquía, establezca los parameters según sus necesidades.

Puede eliminar el post cuando el usuario pulsa el button Atrás, como este

 override func willMove(toParentViewController parent: UIViewController?) { super.willMove(toParentViewController: parent) if parent == nil { navigationItem.prompt = nil } } 

Usted mismo ha dado la respuesta, shinymente. Es un error, pero la comprobación de Translucent evita el error. Por lo tanto, la solución es comprobar Translúcido y luego compensar para que la barra de navigation se vea de la manera que desee.

Para hacerlo, haga una pequeña image de rectángulo negro e inclúyala en su proyecto. Establezca la image de background de la barra de navigation en esta image. Comprobar translúcido. ¡Problema resuelto! La barra de navigation ahora tiene un aspecto negro opaco, pero ya no muestra el error.

introduzca la descripción de la imagen aquí

Versión Swift:

 class PromptViewSideEffect: UIView { override func didMoveToSuperview() { super.didMoveToSuperview() if let superview: UIView = self.superview { let rect: CGRect = superview.bounds rect.origin.y += 44 rect.size.height -= 44 self.frame = rect } } } 

El problema existe si sus barras de navigation son opacas o traslúcidas. Es una mierda que Apple haya permitido que este insoportable error nos plague desde hace más de tres años.

Todas estas soluciones son hacks. Mi solución es A) NUNCA use las indicaciones, o B) las use en todas las vistas, incluso si tiene que establecerlas en "".