2016-04-24 16 views
7

Applicazione foto incorporata per dissolvenza in apertura/chiusura barra quando si tocca un'immagine. In questo modo l'app Foto consente di vederlo a schermo intero.Come eseguire la dissolvenza in apertura/chiusura della barra di navigazione su iOS 9?

Come si fa questo (dissolvenza dell'efetto)?

Come ho capito, navigationController?.navigationBar.alpha non funziona più (quindi non è possibile animarlo in questo modo).

+0

E il 'UINavigationController setNavigationBarHidden: animato: metodo' ? – rmaddy

+0

BTW - Ho un'app che anima la proprietà 'alpha' di' navigationBar' e funziona perfettamente. Non sei sicuro del motivo per cui dici che non funziona più. Provalo. – rmaddy

+0

@rmaddy Mostra e nasconde la barra di navigazione. Tuttavia, usa diverse animazioni. Lo fa scorrere su e giù (vs dissolvenza in entrata e in uscita) –

risposta

5

Condividere tutti i miei risultati.

modalità Reclami su

Francamente, mi sento mezzo incazzato/come un manichino che ho dovuto lottare un buon giorno per implementare cosa semplice esistente in Apple App.

modalità Reclami off

Prima di tutto ecco alcune contesto. Sto lavorando con navigationBar che sono forniti da navigationController (vs solo barre autonome che sono cadute manualmente nella tua vista)

Ci sono diversi approcci che ho trovato. Ne cito tutti loro (anche se non ho avuto successo con loro)

1) Animare cambiamento di alfa del navigationBar

UIView.animateWithDuration(0.1, animations: { 
    navigationController?.navigationBar.alpha = 0 
}, completion: nil) 

menzione @rmaddy qui che funziona per lui. Tuttavia, credo che abbia una barra indipendente (contro una barra gestita da navigationController).

Ho utilizzato uno strumento Reveal per controllare la gerarchia dell'interfaccia utente e ho trovato un paio di cose. - C'è una barra di navigazione che è nascosta (e navigationController?.navigationBar fa riferimento a esso). Quindi puoi cambiare l'alfa alla gioia del tuo cuore, ma queste modifiche non saranno visibili.

C'è tuttavia un'altra barra di navigazione. Presumo che sia referenziato in alcuni membri privati ​​di navigationController (chiamiamolo private navigationBar). È visibile e questo è ciò che viene visualizzato nella parte superiore della visualizzazione.

2) Uso setNavigationBarHidden: animato:

Questo è un modo standard per nascondere/mostrare barra di navigazione. È animato in modo diverso (scorre/su e giù). Tuttavia, se è ok per te, vai con questo, perché è semplice e pulito.

navigationController?.setNavigationBarHidden(true, animated: true) 

Inoltre è possibile avvolgere in UIView.beginAnimations, UIView.commitAnimations per animare insieme ad alcune altre cose (per renderlo più morbido)

3) Anima cambiamento di alpha di barra di navigazione privata.

questo ha funzionato per me:

let privateNavigationBar = self.superview?.superview?.superview?.superview?.superview?.superview?.subviews[1] 
UIView.animateWithDuration(0.1, animations: { 
     privateNavigationBar.alpha = 0 
    }, completion: nil) 

ho intenzione strada attraverso la gerarchia per ottenere una vista che contiene navigationBar privata (che è la seconda visualizzazione secondaria per quella vista).

Tuttavia, questo approccio ha più lati negativi:

  • Credo ° superviews? dipende dalla tua gerarchia di app (vs stai utilizzando la visualizzazione divisa e così via). Penso che puoi generalizzare o potresti semplicemente percorrere l'intera gerarchia per trovare non nascosto UINavigationBar per risolvere questo problema.
  • ho la sensazione che Apple potrebbe cipiglio a questo (la vostra applicazione non essere accettato all'AppStore)

4) Fare navigationBar trasparente e l'immagine di sfondo impostato per essere trasparenti e cambiare canale alfa su di esso.

Non riesco a trovare dove leggo di questa idea. C'erano un paio di menzioni.

C'è Apple example app che mostra come personalizzare NavigationBar, anche rendendolo trasparente.

È interessante notare che questa app di esempio funziona per me (la barra di navigazione è trasparente). Tuttavia, quando ho provato questo codice nella mia app non ha funzionato (non ho ancora capito cosa sta succedendo con questo). Come al solito ci sono sacco di variabili (può essere qualcosa in Info.plist, anche loro sottoclasse navigationController, può anche essere qualcosa in gerarchia della vista)

5) Aggiunta standalone navigationBar

È possibile nascondere un bar fornito da navigationController. Aggiungi il tuo a UIView, collegalo a @IBOutlet e usa l'animazione alfa su di esso (molto probabilmente questo è ciò che @rmaddy si riferiva anche tu).

Ho controllato e questo è lavoro.

Questo approccio è utilizzato nel tutorial this.

Tuttavia, ha un rovescio della medaglia:

  • credo che non gestirà la rotazione bene, aumento di altezza di stato mentre chiamata o GPS

Ogni volta che vedo un codice come questo (scritto nell'articolo) So che ci saranno problemi con il ridimensionamento: CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 64.0)

È possibile sostituirlo con vincoli. Sono andato su questa strada, ma inciampo su alcuni problemi.

6) Altri metodi

ho visto altri due metodi. Non so se funzionerà o quello che sarà lati negativi:

Uno di loro in questa domanda: How to hide/show status bar and navigation bar by fading in/out at the same time like the Photos app in iOS 7?

E questa risposta: https://stackoverflow.com/a/18063898/422080