Fix keyboard blinking during authorization screen transitions

This commit is contained in:
Ilya Laktyushin 2024-04-17 23:03:11 +04:00
parent e87e918e6e
commit eee28fae4c
3 changed files with 22 additions and 8 deletions

View File

@ -154,9 +154,9 @@ public final class AuthorizationSequenceCodeEntryController: ViewController {
super.viewDidAppear(animated) super.viewDidAppear(animated)
if let navigationController = self.navigationController as? NavigationController, let layout = self.validLayout { if let navigationController = self.navigationController as? NavigationController, let layout = self.validLayout {
addTemporaryKeyboardSnapshotView(navigationController: navigationController, parentView: self.view, layout: layout) addTemporaryKeyboardSnapshotView(navigationController: navigationController, layout: layout)
} }
self.controllerNode.activateInput() self.controllerNode.activateInput()
} }
@ -215,6 +215,10 @@ public final class AuthorizationSequenceCodeEntryController: ViewController {
if !hadLayout { if !hadLayout {
self.updateNavigationItems() self.updateNavigationItems()
if let navigationController = self.navigationController as? NavigationController {
addTemporaryKeyboardSnapshotView(navigationController: navigationController, layout: layout, local: true)
}
} }
self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationLayout(layout: layout).navigationFrame.maxY, transition: transition) self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationLayout(layout: layout).navigationFrame.maxY, transition: transition)
@ -263,18 +267,20 @@ public final class AuthorizationSequenceCodeEntryController: ViewController {
} }
} }
func addTemporaryKeyboardSnapshotView(navigationController: NavigationController, parentView: UIView, layout: ContainerViewLayout) { func addTemporaryKeyboardSnapshotView(navigationController: NavigationController, layout: ContainerViewLayout, local: Bool = false) {
if case .compact = layout.metrics.widthClass, let statusBarHost = navigationController.statusBarHost { if case .compact = layout.metrics.widthClass, let statusBarHost = navigationController.statusBarHost {
if let keyboardView = statusBarHost.keyboardView { if let keyboardView = statusBarHost.keyboardView {
keyboardView.layer.removeAllAnimations()
if let snapshotView = keyboardView.snapshotView(afterScreenUpdates: false) { if let snapshotView = keyboardView.snapshotView(afterScreenUpdates: false) {
keyboardView.layer.removeAllAnimations()
UIView.performWithoutAnimation { UIView.performWithoutAnimation {
snapshotView.frame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - snapshotView.frame.size.height), size: snapshotView.frame.size) snapshotView.frame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - snapshotView.frame.size.height), size: snapshotView.frame.size)
if let keyboardWindow = statusBarHost.keyboardWindow { if local {
navigationController.view.addSubview(snapshotView)
} else if let keyboardWindow = statusBarHost.keyboardWindow {
keyboardWindow.addSubview(snapshotView) keyboardWindow.addSubview(snapshotView)
} }
Queue.mainQueue().after(0.5, { Queue.mainQueue().after(local ? 0.8 : 0.7, {
snapshotView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak snapshotView] _ in snapshotView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak snapshotView] _ in
snapshotView?.removeFromSuperview() snapshotView?.removeFromSuperview()
}) })

View File

@ -90,7 +90,7 @@ final class AuthorizationSequencePasswordEntryController: ViewController {
super.viewDidAppear(animated) super.viewDidAppear(animated)
if let navigationController = self.navigationController as? NavigationController, let layout = self.validLayout { if let navigationController = self.navigationController as? NavigationController, let layout = self.validLayout {
addTemporaryKeyboardSnapshotView(navigationController: navigationController, parentView: self.view, layout: layout) addTemporaryKeyboardSnapshotView(navigationController: navigationController, layout: layout)
} }
self.controllerNode.activateInput() self.controllerNode.activateInput()
@ -134,6 +134,10 @@ final class AuthorizationSequencePasswordEntryController: ViewController {
if !hadLayout { if !hadLayout {
self.updateNavigationItems() self.updateNavigationItems()
if let navigationController = self.navigationController as? NavigationController {
addTemporaryKeyboardSnapshotView(navigationController: navigationController, layout: layout, local: true)
}
} }
self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationLayout(layout: layout).navigationFrame.maxY, transition: transition) self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationLayout(layout: layout).navigationFrame.maxY, transition: transition)

View File

@ -216,7 +216,7 @@ final class AuthorizationSequenceSignUpController: ViewController {
super.viewDidAppear(animated) super.viewDidAppear(animated)
if let navigationController = self.navigationController as? NavigationController, let layout = self.validLayout { if let navigationController = self.navigationController as? NavigationController, let layout = self.validLayout {
addTemporaryKeyboardSnapshotView(navigationController: navigationController, parentView: self.view, layout: layout) addTemporaryKeyboardSnapshotView(navigationController: navigationController, layout: layout)
} }
self.controllerNode.activateInput() self.controllerNode.activateInput()
@ -242,6 +242,10 @@ final class AuthorizationSequenceSignUpController: ViewController {
if !hadLayout { if !hadLayout {
self.updateNavigationItems() self.updateNavigationItems()
if let navigationController = self.navigationController as? NavigationController {
addTemporaryKeyboardSnapshotView(navigationController: navigationController, layout: layout, local: true)
}
} }
self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationLayout(layout: layout).navigationFrame.maxY, transition: transition) self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationLayout(layout: layout).navigationFrame.maxY, transition: transition)