2015-07-07 20 views
9

Próbuję skopiować przejście push/pop aplikacji Muzyka iOS z półprzezroczystego do przezroczystego paska UINavigationBar, zachowując widoczne elementy UIBarButtonItem. Ponieważ pasek nawigacji nie porusza się sam, uważam, że należy ustawić przezroczysty pasek UINavigationBar dla obu kontrolerów UIViewController i dodać podgląd podzbioru do kontrolera UIViewControler w przezroczystym pasku UINavigationBar, aby symulować półprzezroczysty pasek UINavigationBar. Jakieś rozwiązania tego problemu?Przejście do przezroczystego paska UINavigationBar (muzyka Apple podobna do paska nawigacji)

iOS Music app transition

+0

efremidze, jak trafiłeś do realizacji to? – SAHM

+0

Używam tej biblioteki: https://github.com/MoZhouqi/KMNavigationBarTransition – efremidze

Odpowiedz

8
+3

Jeszcze jedno rozwiązanie: https://blog.austinchou.com/apple-music-like-navigation-bar/ – avdyushin

+0

@avdyushin Dzięki, świetny link! – efremidze

+0

W rzeczywistości ta biblioteka nie jest taka sama jak zaimplementowana w muzyce Google'a ... –

4

Na kontrolerze dane umieścić ten kod

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    guard self.navigationController?.topViewController === self else {return} 

    self.transitionCoordinator()?.animateAlongsideTransition({ [weak self](context) in 
     self?.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) 
     self?.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) 

     }, completion: { context in 
    }) 
} 

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 

    guard self.navigationController?.topViewController === self else {return} 

    self.transitionCoordinator()?.animateAlongsideTransition({ [weak self](context) in 
     self?.navigationController?.navigationBar.setBackgroundImage(nil, forBarMetrics: UIBarMetrics.Default) 
     self?.navigationController?.navigationBar.setBackgroundImage(nil, forBarMetrics: .Default) 
     }, completion: { context in 
    }) 
} 
+0

To prawie idealne, zamiast dwóch wywołań funkcji 'setBackgroundImage' należy ustawić właściwość' shadowImage', w której ustawiam ją na nową 'UIImage()' zamiast zera. Ponadto instrukcje strażników nie wydają się być potrzebne w moim, nie jestem pewien, czy to robi różnicę. –

+1

Należy zauważyć, że aby to zadziałało, własność 'edgesForExtendedLayout' na prezentowanym kontrolerze widoku nie może zawierać górnej krawędzi (tzn. Krawędzi odpowiadający paskowi nawigacji). W przeciwnym razie twoja rozszerzona zawartość zostanie wyświetlona na pasku nawigacji, gdy stanie się przezroczysta podczas przejścia. Jeśli korzystasz z widoku tabeli lub widoku kolekcji, może być konieczne przewinięcie w dół, zanim to się stanie. Aby zachować 'edgesForExtendedLayout', musisz utworzyć zastępczy pasek nawigacji lub wypróbować rozwiązanie takie jak [TFTransparentNavigationBar] (https://github.com/thefuntasty/TFTransparentNavigationBar). – jamesk