Enable status bar animations

This commit is contained in:
Peter 2019-10-25 23:07:54 +04:00
parent 842ef1331b
commit 15f775ba50
6 changed files with 55 additions and 25 deletions

View File

@ -269,6 +269,18 @@ final class NavigationContainer: ASDisplayNode, UIGestureRecognizerDelegate {
}
if controllers.last !== self.state.top?.value {
self.state.top?.value.statusBar.alphaUpdated = nil
if let controller = controllers.last {
controller.statusBar.alphaUpdated = { [weak self, weak controller] transition in
guard let strongSelf = self, let controller = controller else {
return
}
if strongSelf.state.top?.value === controller && strongSelf.state.transition == nil {
strongSelf.statusBarStyleUpdated?(transition)
}
}
}
if controllers.last !== self.state.pending?.value.value {
self.state.pending = nil
if let last = controllers.last {

View File

@ -302,7 +302,20 @@ open class NavigationController: UINavigationController, ContainableController,
private weak var currentTopVisibleOverlayContainerStatusBar: NavigationOverlayContainer? = nil
private var isUpdatingContainers: Bool = false
private func updateContainersNonReentrant(transition: ContainedViewLayoutTransition) {
if self.isUpdatingContainers {
return
}
if let layout = self.validLayout {
self.updateContainers(layout: layout, transition: transition)
}
}
private func updateContainers(layout rawLayout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
self.isUpdatingContainers = true
var layout = rawLayout
if self.ignoreInputHeight {
@ -393,18 +406,14 @@ open class NavigationController: UINavigationController, ContainableController,
guard let strongSelf = self, let modalContainer = modalContainer else {
return
}
if let layout = strongSelf.validLayout {
strongSelf.updateContainers(layout: layout, transition: .animated(duration: 0.5, curve: .spring))
}
strongSelf.updateContainersNonReentrant(transition: .animated(duration: 0.5, curve: .spring))
}
}
modalContainer.updateDismissProgress = { [weak self, weak modalContainer] _, transition in
guard let strongSelf = self, let modalContainer = modalContainer else {
return
}
if let layout = strongSelf.validLayout {
strongSelf.updateContainers(layout: layout, transition: transition)
}
strongSelf.updateContainersNonReentrant(transition: transition)
}
modalContainer.interactivelyDismissed = { [weak self, weak modalContainer] hadInputFocus in
guard let strongSelf = self, let modalContainer = modalContainer else {
@ -632,10 +641,10 @@ open class NavigationController: UINavigationController, ContainableController,
self?.controllerRemoved(controller)
})
flatContainer.statusBarStyleUpdated = { [weak self] transition in
guard let strongSelf = self, let layout = strongSelf.validLayout else {
guard let strongSelf = self else {
return
}
strongSelf.updateContainers(layout: layout, transition: transition)
strongSelf.updateContainersNonReentrant(transition: transition)
}
if previousModalContainer == nil {
flatContainer.keyboardViewManager = self.keyboardViewManager
@ -655,10 +664,10 @@ open class NavigationController: UINavigationController, ContainableController,
self?.controllerRemoved(controller)
})
flatContainer.statusBarStyleUpdated = { [weak self] transition in
guard let strongSelf = self, let layout = strongSelf.validLayout else {
guard let strongSelf = self else {
return
}
strongSelf.updateContainers(layout: layout, transition: transition)
strongSelf.updateContainersNonReentrant(transition: transition)
}
if previousModalContainer == nil {
flatContainer.keyboardViewManager = self.keyboardViewManager
@ -885,6 +894,8 @@ open class NavigationController: UINavigationController, ContainableController,
self.validStatusBarHidden = statusBarHidden
self.statusBarHost?.setStatusBarHidden(statusBarHidden, animated: animateStatusBarStyleTransition)
}
self.isUpdatingContainers = false
}
private func controllerRemoved(_ controller: ViewController) {
@ -1111,16 +1122,12 @@ open class NavigationController: UINavigationController, ContainableController,
}
}
}
if let layout = strongSelf.validLayout {
strongSelf.updateContainers(layout: layout, transition: .immediate)
}
strongSelf.updateContainersNonReentrant(transition: .immediate)
}, statusBarUpdated: { [weak self] transition in
guard let strongSelf = self else {
return
}
if let layout = strongSelf.validLayout {
strongSelf.updateContainers(layout: layout, transition: transition)
}
strongSelf.updateContainersNonReentrant(transition: transition)
})
if inGlobal {
self.globalOverlayContainers.append(container)
@ -1131,9 +1138,7 @@ open class NavigationController: UINavigationController, ContainableController,
guard let strongSelf = self, let container = container else {
return
}
if let layout = strongSelf.validLayout {
strongSelf.updateContainers(layout: layout, transition: .immediate)
}
strongSelf.updateContainersNonReentrant(transition: .immediate)
}
if let layout = self.validLayout {
self.updateContainers(layout: layout, transition: .immediate)

View File

@ -64,15 +64,26 @@ private final class StatusBarView: UITracingLayerView {
}
public final class StatusBar: ASDisplayNode {
public var statusBarStyle: StatusBarStyle = .Black {
didSet {
if self.statusBarStyle != oldValue {
self.layer.invalidateUpTheTree()
private var _statusBarStyle: StatusBarStyle = .Black
public var statusBarStyle: StatusBarStyle {
get {
return self._statusBarStyle
} set(value) {
if self._statusBarStyle != value {
self._statusBarStyle = value
self.alphaUpdated?(.immediate)
}
}
}
public func updateStatusBarStyle(_ statusBarStyle: StatusBarStyle, animated: Bool) {
if self._statusBarStyle != statusBarStyle {
self._statusBarStyle = statusBarStyle
self.alphaUpdated?(animated ? .animated(duration: 0.3, curve: .easeInOut) : .immediate)
}
}
public var ignoreInCall: Bool = false
var inCallNavigate: (() -> Void)?

View File

@ -125,6 +125,8 @@ public enum ViewControllerNavigationPresentation {
open var navigationPresentation: ViewControllerNavigationPresentation = .default
var _presentedInModal: Bool = false
public var presentedOverCoveringView: Bool = false
public var presentationArguments: Any?
public var tabBarItemDebugTapAction: (() -> Void)?

View File

@ -400,7 +400,7 @@ open class ItemListController: ViewController, KeyShortcutResponder, Presentable
strongSelf.theme = controllerState.theme
strongSelf.navigationBar?.updatePresentationData(NavigationBarPresentationData(theme: NavigationBarTheme(rootControllerTheme: strongSelf.theme), strings: NavigationBarStrings(presentationStrings: strongSelf.strings)))
strongSelf.statusBar.statusBarStyle = strongSelf.theme.rootController.statusBarStyle.style
strongSelf.statusBar.updateStatusBarStyle(strongSelf.theme.rootController.statusBarStyle.style, animated: true)
strongSelf.segmentedTitleView?.theme = controllerState.theme

View File

@ -685,7 +685,7 @@ public final class ThemeSettingsCrossfadeController: ViewController {
super.init(navigationBarPresentationData: nil)
self.statusBar.statusBarStyle = .Hide
self.statusBar.statusBarStyle = .Ignore
}
required public init(coder aDecoder: NSCoder) {