2017-06-12 3 views
4

Ich habe eine View-Controller A, die die Statusleiste an der Spitze zeigt. Von diesem View-Controller möchte ich einen anderen View-Controller B vorstellen, der die Statusleiste verbirgt. Um zu erreichen, dass ichVerstecken Statusleiste nur auf modal präsentiert View Controller

override var prefersStatusBarHidden: Bool { 
    return true 
} 

auf B die Eigenschaft außer Kraft setzen. Für eine glatte Animation Durchsetzung, wenn die Statusleiste (dis) erscheint I außer Kraft setzt auch die Eigenschaft

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    return .slide 
} 

Allerdings, wenn ich jetzt vorliegende View-Controller B von A die Statusleiste verschwindet abrupt während A noch sichtbar ist, richtig bevor der animierte modale Übergang beginnt.

Ich bin auf der Suche nach einem Weg zu beheben Sie diese "springenden Statusleiste" Verhalten. Im Idealfall würde Ich mag eine saubere Trennung haben:

  • A: zeigt Statusleiste
  • B: nicht Statusleiste wird zeigen

, so dass, wenn ich B präsentieren, Die Statusleiste ist damit abgedeckt.

Da die Statusleiste scheint eine globale Ansicht, die zu keinem bestimmten View-Controller gehören, ist es wahrscheinlich schwierig, diese Art von Verhalten zu erreichen. Für den Fall, dass es nicht möglich ist, dieses genaue Animationsverhalten zu replizieren, würde ich mich auch freuen, wenn die Statusleiste während des View-Controller-Übergangs reibungslos gleitet. Wie kann ich das erreichen?

Antwort

2

Für die Statusleiste während des Übergangs Animieren, könnten Sie so etwas wie dies im Hinblick auf die Steuerung B tun:

var willAppear = false 

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    return .slide 
} 

override var prefersStatusBarHidden: Bool { 
    return willAppear 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
    willAppear = true 
    UIView.animate(withDuration: 0.5) { 
     self.setNeedsStatusBarAppearanceUpdate() 
    } 
} 

Dann denke ich, Sie das Gegenteil tun müssten, wenn Sie den umgekehrten Effekt, wenn die modale wollen Controller wird entlassen.

Sie können die Dauer der Animation anpassen, die zu Ihnen passt, obwohl ich nicht sicher bin, wie konsistent die Dauer zwischen viewWillAppear und dem tatsächlich präsentierten Modal Controller sein wird.

EDIT:

"Gegenüber" endet als so etwas wie dies oben (in-View-Controller A):

var willAppear = false 

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    return .slide 
} 

override var prefersStatusBarHidden: Bool { 
    return willAppear 
} 

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    if let _ = presentedViewController as? B { 
     willAppear = true 
    } 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
    if let _ = presentedViewController as? B { 
     willAppear = false 
     UIView.animate(withDuration: 0.5) { 
      self.setNeedsStatusBarAppearanceUpdate() 
     } 
    } 
} 

Was ich zustimmen, wird viel zu viel Code für etwas, das ich viele vorstellen Leute wollen.

+0

Danke für Ihre Antwort. Die eine Hälfte funktioniert, die andere Hälfte (das "Gegenteil", wenn man den View-Controller ablehnt) nicht. Es scheint, dass Sie den _both_ View-Controllern, die am Übergang beteiligt sind, Code hinzufügen müssen, um eine reibungslose Slide-In- und Slide-Out-Animation für die Statusleiste zu erhalten. Ich werde später eine weitere Antwort hinzufügen, um diesen Ansatz zu erklären.Es ist wirklich ärgerlich, dass Apple das so kompliziert gemacht hat und die Statusleiste nicht automatisch animiert - ich behaupte, dass dies in 99% aller Fälle das Verhalten wäre, das Entwickler wollen. – Mischa

+0

Sorry, ich hätte besser "Gegenteil" geklärt! Ich dachte, das könnte passieren. Der Übergang scheint auch etwas kniffliger zu sein. Ich denke, Sie müssen möglicherweise "viewWillDisappear" und "viewWillAppear" verwenden und sicherstellen, dass Sie zum View-Controller wechseln, für den die Statusleiste ausgeblendet sein muss, bevor Sie das Flag setzen. Ich werde meine Antwort auch aktualisieren. – Samantha

+0

@Samantha danke es hat mir geholfen ... –

Verwandte Themen