item custom bar ios objective-c uiview uinavigationcontroller uinavigationbar
FakeNavBar

ios - custom - ¿Cómo desaparezco "legalmente" la barra de navegación en una aplicación?



navigation bar swift 4 (6)

No conozco ninguna forma sancionada por Apple para hacer esto. Dudo que seas rechazado por modificar el valor alfa de la barra de navegación, pero como tú, no lo sé con certeza.

Por supuesto, puede implementar su propio controlador de navegación / barra de navegación con la que puede hacer lo que quiera. Eso es lo que he hecho en mis aplicaciones cuando necesito hacer algo como esto. Apple ha estado totalmente bien con eso. Puntos de bonificación: Apple puede cambiar sus controles tanto como lo deseen sin romper su diseño si usa controles personalizados. Esto fue recientemente un problema en ciertas áreas de nuestra aplicación donde la aplicación se ve muy diferente en diferentes versiones de iOS (7).

De todos modos, ese es mi 2 centavos ...

Parece que la única forma de eliminar una barra de navegación con animación es deslizándola hacia arriba. Quiero que se desvanezca, como en Photos.app.

Sería más fácil cambiar el alfa, sin embargo, las directrices de Apple dicen :

Antes de iOS v5.0, cuando se usa junto con un controlador de navegación, solo hay un puñado de personalizaciones directas que puede realizar en la barra de navegación. Específicamente, está bien modificar las propiedades barStyle, tintColor y translúcidas, pero nunca debe cambiar directamente las propiedades de nivel de UIView, como el marco, los límites, el alfa o las propiedades ocultas directamente.

El lenguaje es un poco extraño, como dice antes de iOS 5, pero indicó que no está permitido cambiar el valor alfa directamente, y nunca dice que está permitido hacerlo ahora.

No quiero que mi aplicación sea rechazada.

¿Cómo me desvanezco de la barra de navegación como lo haría con la barra de estado?


Si sigues leyendo, este es el siguiente párrafo justo después de tu cita:

En iOS v5.0 y posterior, puede personalizar la apariencia de la barra usando los métodos detallados en "Personalizar la apariencia de la barra". Puede personalizar la apariencia de todas las barras de navegación usando el proxy de apariencia ([apariencia de UINavigationBar]), o simplemente de una sola barra.

Al hacer clic en el enlace (Personalizar la apariencia de la barra), se le mostrará esto:

Personalizar la apariencia de la barra
Propiedad tintColor
- backgroundImageForBarMetrics:
- setBackgroundImage: forBarMetrics:
- titleVerticalPositionAdjustmentForBarMetrics:
- setTitleVerticalPositionAdjustment: forBarMetrics:
propiedad titleTextAttributes

Entonces en iOS v5.0 y posterior, esa es la lista que usted puede (legalmente) cambiar. Es posible que pueda jugar algunos juegos con el alfa del tintColor o una imagen de fondo para que parezca que se está desvaneciendo (y luego ocultarlo), pero dudo que se vea del todo bien. Probablemente vale la pena intentarlo.


Una forma de evitar esto (no sé exactamente cómo planea animar a la siguiente vista o de qué manera desea incorporar el fundido) es renderizar la vista actual a una uiimagen, hacer una UIImageView a pantalla completa con esta imagen (Básicamente, reemplaza tu UIView existente con una imagen) Intercambia tu nueva vista detrás de la vista de la imagen y luego difumina la vista de la imagen.

También puede recortar solo la parte UInavigationBar de la imagen y fundirla después de la transición. De esta forma, puede aplicar cualquier efecto de imagen al ''UINavgationBar'' sin ser rechazado por Apple.


Es posible que no pueda desvanecer fácilmente la barra de navegación, pero puede desvanecer fácilmente una imagen de la barra de navegación. Entonces, una cosa que podrías hacer es crear una imagen de la barra de navegación, reemplazar la barra de navegación con tu imagen y luego animar la vista de la imagen con alfa yendo a 0. O podrías hacer lo contrario: posicionar una vista de imagen en la parte superior la barra de navegación, y se desvanece en una imagen de lo que se supone que está detrás de la barra de navegación.


Esto fue divertido de resolver.

Debería haber sido muy directo: use UIView transitionWithView para realizar un fundido cruzado entre los estados ocultos y no ocultos de la barra de navegación, tal como lo establece la API pública setNavigationBarHidden:animated: De hecho, esto funciona para "desvanecer" la barra de navegación, pero volver a fundirla tenía un problema. El problema era que la barra de navegación se deslizaba en su lugar independientemente del hecho de que UIView +transitionWithView: no animara las propiedades animables (por ejemplo, frame ) a menos que especificara UIViewAnimationOptionAllowAnimatedContent .

Para mí esto dice que internamente el UINavigationController reposiciona UINavigationBar dentro de un bloque de animación independientemente de si se especificó la animación en la llamada a setNavigationBarHidden:animated: La duración de este bloque de animación probablemente se establece en ''0'' cuando animate: está establecido en NO .

La solución es establecer la barra de navegación visible (sin animación) antes de la transición de fundido cruzado. Esto garantiza que la barra de navegación comience el fundido cruzado en la posición correcta, y que el fundido cruzado solo revelará el nuevo estado no oculto.

Mi proyecto de muestra es una aplicación de vista única estándar. En el guión gráfico hay un UINavigationController , que es el punto de entrada. Establecí el estilo de barra para UINavigationBar este controlador en negro translúcido (similar a la aplicación Fotos). El controlador de navegación rootViewController es un UIViewController simple con un UIImageView llena los límites completos (también como la aplicación Fotos). UITapGestureRecognizer un UITapGestureRecognizer en la vista para invocar el siguiente código, en el controlador de vista:

- (IBAction) onShowHideNavbar: (id) sender { BOOL hide = !self.navigationController.navigationBarHidden; if ( !hide) { [self.navigationController setNavigationBarHidden: hide animated: NO]; } [UIView transitionWithView: self.navigationController.view duration: 1 options: UIViewAnimationOptionTransitionCrossDissolve animations: ^{ [self.navigationController setNavigationBarHidden: hide animated: NO]; } completion: nil ]; }

Dicho todo esto, no creo que te metes en ningún problema (Rechazo de Apple) por jugar con las propiedades ocultas o alfa de UINavigationBar directamente. Los documentos advierten sobre no tocar estos porque están gestionados por el UINavigationController y cambiarlos podría tener consecuencias no vistas. Pero en My Opinion son API públicas y, como tal, su uso no debería ser motivo de rechazo.


No puede animar legalmente las propiedades de la barra de navegación de un UINavigationController.
Sin embargo, puede mostrar un controlador de navegación con barra de navegación oculta (ocultándolo siempre o solo en un controlador de vista específico, como prefiera) y reemplácelo con su instancia "especial" de UINavigationBar ;-)

Adjunto un proyecto de muestra (utilicé una plantilla de Xcode para crearlo más rápido): FakeNavBar

Mire el método viewDidLoad del DetailViewController :

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self configureView]; self.fakeBar = [[UINavigationBar alloc]initWithFrame:self.navigationController.navigationBar.bounds]; UIBarButtonItem *back = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(back)]; UINavigationItem *backItem = [[UINavigationItem alloc]initWithTitle:@"Back"]; backItem.leftBarButtonItem = back; [self.fakeBar pushNavigationItem:backItem animated:YES]; [self.view addSubview:self.fakeBar]; }

Aquí hay un video del producto final en YouTube .