2014-10-04 16 views
19

iOS 8 aggiunge una nuova fantastica funzione: nasconde la barra di navigazione quando l'utente sta scorrendo.Nascondi barra di stato durante lo scorrimento

questo con una sola riga in viewDidload:

navigationController?.hidesBarsOnSwipe = true 

fredda, non è vero?

Ma ora ho un piccolo problema: quando la barra di navigazione è nascosta, la barra di stato è ancora qui e si sovrappone al contenuto, che è brutto.

Cosa devo fare per farlo nascosto quando la barra di navigazione è nascosta?

+0

Ehi, hai mai trovato il modo di fare questo? Grazie! – dot

+0

No purtroppo ... potresti aggiungere +1? – jmcastel

+0

Dai un'occhiata alla mia domanda: http://stackoverflow.com/questions/25870382/how-to-prevent-status-bar-from-overlapping-content-with-hidesbarsonswipe-set-on –

risposta

0

Sto basando questa risposta su alcuni commenti su this post, che sono speculazioni. Non sono sicuro che funzioni, perché Apple non ci fornisce alcun metodo diretto o metodo delegato per quando la barra di navigazione si nasconde.

Sottoclasse UINavigationBar come barra di navigazione. Aggiungere un osservatore proprietà per la sua proprietà hidden in questo modo:

var hidden: Bool{ 
didSet{ 
    UIApplication.sharedApplication().setStatusBarHidden(self.hidden, animation: .Slide) 
} 
} 

Si vuole quindi andare al vostro metodo di viewDidLoad nel controller vista principale, e impostare la vostra proprietà self.navigationBar (o self.navigationController.navigationBar, non sono sicuro che uno) a un'istanza della tua nuova classe NavigationBar.

Nota che non posso testarlo subito, fammi sapere come/se funziona.

+0

Non funziona. Dove devo mettere la dichiarazione nascosta var? self.navigationController.navigationBar dammi "UINavigationController non ha un membro chiamato navigationBar". self.navigationBar dammi "myTableViewController non ha un membro chiamato navigationBar" – jmcastel

+0

@jmcastel Non UINavigationController ha una barra di navigazione? https://developer.apple.com/library/ios/documentation/Uikit/reference/UINavigationController_Class/index.html#//apple_ref/occ/instp/UINavigationController/navigationBar – erdekhayser

+0

Lo so, ma questo è l'errore ( – jmcastel

1

Questo problema è fissato per in Xcode 6,1

navigationController .navigationBar.hidden = true

+1

ho solo vuoi nascondere la barra di stato quando la barra di navigazione è nascosta. Come monitorare questo? – jmcastel

10

Override i seguenti metodi di UIViewController:?

extension MyViewController { 
    override func prefersStatusBarHidden() -> Bool { 
    return barsHidden // this is a custom property 
    } 

    // Override only if you want a different animation than the default 
    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { 
    return .Slide 
    } 
} 

Aggiornamento barsHidden da qualche parte in il codice e chiama setNeedsStatusBarAppearanceUpdate()

0

È possibile rilevare i passaggi utilizzando UISwipeGestureRecognizer. Sto usando su UIWebView:

In viewDidLoad ho:

let swipeUp = UISwipeGestureRecognizer(target: self, action: "didSwipe") 
let swipeDown = UISwipeGestureRecognizer(target: self, action: "didSwipe") 
swipeUp.direction = UISwipeGestureRecognizerDirection.Up 
swipeDown.direction = UISwipeGestureRecognizerDirection.Down 
webView.addGestureRecognizer(swipeUp) 
webView.addGestureRecognizer(swipeDown) 
navigationController?.hidesBarsOnSwipe = true 

Ho anche un'estensione al mio viewcontroller, chiamato WebViewViewController:

extension WebViewViewController { 
    override func prefersStatusBarHidden() -> Bool { 
     return hideStatusBar 
    } 

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { 
     return UIStatusBarAnimation.Slide 
    } 
} 

A livello di classe nel mio WebViewViewController Ho anche:

var hideStatusBar = false 

func didSwipe() { 
    hideStatusBar = true 
} 
0

Okay, ho passato tutto il giorno a fare questo, speriamo questo ps qualcuno fuori. C'è un barHideOnSwipeGestureRecognizer. Quindi potresti creare un listener per il corrispondente UIPanGesture, notando che se la barra di navigazione è nascosta, la sua origine y è -44,0; altrimenti, è 0 (non 20 perché abbiamo nascosto la barra di stato!).

Nel vostro controller della vista:

// Declare at beginning 
var curFramePosition: Double! 
var showStatusBar: Bool = true 
self.navigationController?.barHideOnSwipeGestureRecognizer.addTarget(self, action: "didSwipe:") 

... 

override func viewDidLoad(){ 
    self.navigationController?.hidesBarsOnSwipe = true 
    curFramePosition = 0.0 // Not hidden 
    self.navigationController?.barHideOnSwipeGestureRecognizer.addTarget(self, action: "didSwipe:") 
    ... 
} 

func didSwipe(swipe: UIPanGestureRecognizer){ 
    // Visible to hidden 
    if curFramePosition == 0 && self.navigationController?.navigationBar.frame.origin.y == -44 { 
     curFramePosition = -44 
     showStatusBar = false 
     prefersStatusBarHidden() 
     setNeedsStatusBarAppearanceUpdate() 
    } 
    // Hidden to visible 
    else if curFramePosition == -44 && self.navigationController?.navigationBar.frame.origin.y == 0 { 
     curFramePosition = 0 
     showStatusBar = true 
     prefersStatusBarHidden() 
     setNeedsStatusBarAppearanceUpdate() 
    } 
} 

override func prefersStatusBarHidden() -> Bool { 
    if showStatusBar{ 
     return false 
    } 
    return true 
} 
Problemi correlati