UI improvements

This commit is contained in:
Ali
2022-09-09 21:34:27 +04:00
parent e61ae3c0b3
commit 64b1eab732
24 changed files with 675 additions and 122 deletions

View File

@@ -154,6 +154,7 @@ open class NavigationController: UINavigationController, ContainableController,
private var overlayContainers: [NavigationOverlayContainer] = []
private var globalOverlayContainers: [NavigationOverlayContainer] = []
private var globalOverlayBelowKeyboardContainerParent: GlobalOverlayContainerParent?
private var globalOverlayContainerParent: GlobalOverlayContainerParent?
public var globalOverlayControllersUpdated: (() -> Void)?
@@ -351,7 +352,7 @@ open class NavigationController: UINavigationController, ContainableController,
private var isUpdatingContainers: Bool = false
private func updateContainersNonReentrant(transition: ContainedViewLayoutTransition) {
func updateContainersNonReentrant(transition: ContainedViewLayoutTransition) {
if self.isUpdatingContainers {
return
}
@@ -375,7 +376,18 @@ open class NavigationController: UINavigationController, ContainableController,
let initialPrefersOnScreenNavigationHidden = self.collectPrefersOnScreenNavigationHidden()
var overlayLayout = layout
let belowKeyboardOverlayLayout = layout
var globalOverlayLayout = layout
if let globalOverlayBelowKeyboardContainerParent = self.globalOverlayBelowKeyboardContainerParent {
if globalOverlayBelowKeyboardContainerParent.view.superview != self.displayNode.view {
self.displayNode.addSubnode(globalOverlayBelowKeyboardContainerParent)
}
/*overlayLayout.size.height = overlayLayout.size.height - (layout.inputHeight ?? 0.0)
overlayLayout.inputHeight = nil
overlayLayout.inputHeightIsInteractivellyChanging = false*/
}
if let globalOverlayContainerParent = self.globalOverlayContainerParent {
let portraitSize = CGSize(width: min(layout.size.width, layout.size.height), height: max(layout.size.width, layout.size.height))
@@ -386,9 +398,9 @@ open class NavigationController: UINavigationController, ContainableController,
self.displayNode.addSubnode(globalOverlayContainerParent)
}
overlayLayout.size.height = overlayLayout.size.height - (layout.inputHeight ?? 0.0)
overlayLayout.inputHeight = nil
overlayLayout.inputHeightIsInteractivellyChanging = false
globalOverlayLayout.size.height = globalOverlayLayout.size.height - (layout.inputHeight ?? 0.0)
globalOverlayLayout.inputHeight = nil
globalOverlayLayout.inputHeightIsInteractivellyChanging = false
} else if layout.inputHeight == nil {
if globalOverlayContainerParent.view.superview != self.displayNode.view {
self.displayNode.addSubnode(globalOverlayContainerParent)
@@ -438,6 +450,9 @@ open class NavigationController: UINavigationController, ContainableController,
}
}
if let globalOverlayBelowKeyboardContainerParent = self.globalOverlayBelowKeyboardContainerParent {
transition.updateFrame(node: globalOverlayBelowKeyboardContainerParent, frame: CGRect(origin: CGPoint(), size: layout.size))
}
if let globalOverlayContainerParent = self.globalOverlayContainerParent {
transition.updateFrame(node: globalOverlayContainerParent, frame: CGRect(origin: CGPoint(), size: layout.size))
}
@@ -525,6 +540,7 @@ open class NavigationController: UINavigationController, ContainableController,
var additionalSideInsets = UIEdgeInsets()
var modalStyleOverlayTransitionFactor: CGFloat = 0.0
var previousGlobalOverlayBelowKeyboardContainer: NavigationOverlayContainer?
var previousGlobalOverlayContainer: NavigationOverlayContainer?
for i in (0 ..< self.globalOverlayContainers.count).reversed() {
let overlayContainer = self.globalOverlayContainers[i]
@@ -536,26 +552,61 @@ open class NavigationController: UINavigationController, ContainableController,
containerTransition = transition
}
let overlayWantsToBeBelowKeyboard = overlayContainer.controller.overlayWantsToBeBelowKeyboard
let overlayLayout: ContainerViewLayout
if overlayWantsToBeBelowKeyboard {
overlayLayout = belowKeyboardOverlayLayout
} else {
overlayLayout = globalOverlayLayout
}
containerTransition.updateFrame(node: overlayContainer, frame: CGRect(origin: CGPoint(), size: overlayLayout.size))
overlayContainer.update(layout: overlayLayout, transition: containerTransition)
modalStyleOverlayTransitionFactor = max(modalStyleOverlayTransitionFactor, overlayContainer.controller.modalStyleOverlayTransitionFactor)
if overlayContainer.supernode == nil && overlayContainer.isReady {
if let previousGlobalOverlayContainer = previousGlobalOverlayContainer {
self.globalOverlayContainerParent?.insertSubnode(overlayContainer, belowSubnode: previousGlobalOverlayContainer)
if overlayContainer.isReady {
let wasNotAdded = overlayContainer.supernode == nil
if overlayWantsToBeBelowKeyboard {
if overlayContainer.supernode !== self.globalOverlayBelowKeyboardContainerParent {
if let previousGlobalOverlayBelowKeyboardContainer = previousGlobalOverlayBelowKeyboardContainer {
self.globalOverlayBelowKeyboardContainerParent?.insertSubnode(overlayContainer, belowSubnode: previousGlobalOverlayBelowKeyboardContainer)
} else {
self.globalOverlayBelowKeyboardContainerParent?.addSubnode(overlayContainer)
}
}
} else {
self.globalOverlayContainerParent?.addSubnode(overlayContainer)
if overlayContainer.supernode !== self.globalOverlayContainerParent {
if let previousGlobalOverlayContainer = previousGlobalOverlayContainer {
self.globalOverlayContainerParent?.insertSubnode(overlayContainer, belowSubnode: previousGlobalOverlayContainer)
} else {
self.globalOverlayContainerParent?.addSubnode(overlayContainer)
}
}
}
if wasNotAdded {
overlayContainer.transitionIn()
notifyGlobalOverlayControllersUpdated = true
overlayContainer.controller.internalOverlayWantsToBeBelowKeyboardUpdated = { [weak self] transition in
guard let strongSelf = self else {
return
}
strongSelf.updateContainersNonReentrant(transition: transition)
}
}
overlayContainer.transitionIn()
notifyGlobalOverlayControllersUpdated = true
}
let controllerAdditionalSideInsets = overlayContainer.controller.additionalSideInsets
additionalSideInsets = UIEdgeInsets(top: 0.0, left: max(additionalSideInsets.left, controllerAdditionalSideInsets.left), bottom: 0.0, right: max(additionalSideInsets.right, controllerAdditionalSideInsets.right))
if overlayContainer.supernode != nil {
previousGlobalOverlayContainer = overlayContainer
if overlayContainer.controller.overlayWantsToBeBelowKeyboard {
previousGlobalOverlayBelowKeyboardContainer = overlayContainer
} else {
previousGlobalOverlayContainer = overlayContainer
}
let controllerStatusBarStyle = overlayContainer.controller.statusBar.statusBarStyle
switch controllerStatusBarStyle {
case .Black, .White, .Hide:
@@ -594,6 +645,8 @@ open class NavigationController: UINavigationController, ContainableController,
self.displayNode.insertSubnode(overlayContainer, belowSubnode: previousOverlayContainer)
} else if let globalScrollToTopNode = self.globalScrollToTopNode {
self.displayNode.insertSubnode(overlayContainer, belowSubnode: globalScrollToTopNode)
} else if let globalOverlayBelowKeyboardContainerParent = self.globalOverlayBelowKeyboardContainerParent {
self.displayNode.insertSubnode(overlayContainer, belowSubnode: globalOverlayBelowKeyboardContainerParent)
} else if let globalOverlayContainerParent = self.globalOverlayContainerParent {
self.displayNode.insertSubnode(overlayContainer, belowSubnode: globalOverlayContainerParent)
} else {
@@ -674,7 +727,7 @@ open class NavigationController: UINavigationController, ContainableController,
}
containerTransition.updateFrame(node: modalContainer, frame: CGRect(origin: CGPoint(), size: layout.size))
modalContainer.update(layout: modalContainer.isFlat ? overlayLayout : layout, controllers: navigationLayout.modal[i].controllers, coveredByModalTransition: effectiveModalTransition, transition: containerTransition)
modalContainer.update(layout: modalContainer.isFlat ? globalOverlayLayout : layout, controllers: navigationLayout.modal[i].controllers, coveredByModalTransition: effectiveModalTransition, transition: containerTransition)
if modalContainer.supernode == nil && modalContainer.isReady {
if let previousModalContainer = previousModalContainer {
@@ -1228,6 +1281,10 @@ open class NavigationController: UINavigationController, ContainableController,
self.displayNode.addSubnode(globalScrollToTopNode)
self.globalScrollToTopNode = globalScrollToTopNode
let globalOverlayBelowKeyboardContainerParent = GlobalOverlayContainerParent()
self.displayNode.addSubnode(globalOverlayBelowKeyboardContainerParent)
self.globalOverlayBelowKeyboardContainerParent = globalOverlayBelowKeyboardContainerParent
let globalOverlayContainerParent = GlobalOverlayContainerParent()
self.displayNode.addSubnode(globalOverlayContainerParent)
self.globalOverlayContainerParent = globalOverlayContainerParent