Keep keyboard static during authorization sequence on iOS 16

This commit is contained in:
Ilya Laktyushin 2022-11-29 20:57:59 +04:00
parent e70d6867d9
commit 9f69dd9012
9 changed files with 61 additions and 9 deletions

View File

@ -2,6 +2,7 @@ import Foundation
import UIKit import UIKit
import Display import Display
import AsyncDisplayKit import AsyncDisplayKit
import SwiftSignalKit
import TelegramCore import TelegramCore
import TelegramPresentationData import TelegramPresentationData
import ProgressNavigationButtonNode import ProgressNavigationButtonNode
@ -120,6 +121,10 @@ public final class AuthorizationSequenceCodeEntryController: ViewController {
override public func viewDidAppear(_ animated: Bool) { override public func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) super.viewDidAppear(animated)
if let navigationController = self.navigationController as? NavigationController, let layout = self.validLayout {
addTemporaryKeyboardSnapshotView(navigationController: navigationController, parentView: self.view, layout: layout)
}
self.controllerNode.activateInput() self.controllerNode.activateInput()
} }
@ -219,3 +224,25 @@ public final class AuthorizationSequenceCodeEntryController: ViewController {
self.controllerNode.updateCode("\(code)") self.controllerNode.updateCode("\(code)")
} }
} }
func addTemporaryKeyboardSnapshotView(navigationController: NavigationController, parentView: UIView, layout: ContainerViewLayout) {
if case .compact = layout.metrics.widthClass, let statusBarHost = navigationController.statusBarHost {
if let keyboardView = statusBarHost.keyboardView {
if let snapshotView = keyboardView.snapshotView(afterScreenUpdates: false) {
keyboardView.layer.removeAllAnimations()
UIView.performWithoutAnimation {
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 {
keyboardWindow.addSubview(snapshotView)
}
Queue.mainQueue().after(0.45, {
snapshotView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak snapshotView] _ in
snapshotView?.removeFromSuperview()
})
})
}
}
}
}
}

View File

@ -74,6 +74,8 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
self.codeInputView.alpha = self.inProgress ? 0.6 : 1.0 self.codeInputView.alpha = self.inProgress ? 0.6 : 1.0
} }
} }
private let appearanceTimestamp = CACurrentMediaTime()
init(strings: PresentationStrings, theme: PresentationTheme) { init(strings: PresentationStrings, theme: PresentationTheme) {
self.strings = strings self.strings = strings
@ -270,8 +272,16 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
} }
func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) {
let previousInputHeight = self.layoutArguments?.0.inputHeight ?? 0.0
let newInputHeight = layout.inputHeight ?? 0.0
self.layoutArguments = (layout, navigationBarHeight) self.layoutArguments = (layout, navigationBarHeight)
var layout = layout
if CACurrentMediaTime() - self.appearanceTimestamp < 2.0, newInputHeight < previousInputHeight {
layout = layout.withUpdatedInputHeight(previousInputHeight)
}
let maximumWidth: CGFloat = min(430.0, layout.size.width) let maximumWidth: CGFloat = min(430.0, layout.size.width)
let inset: CGFloat = 24.0 let inset: CGFloat = 24.0

View File

@ -89,6 +89,10 @@ final class AuthorizationSequencePasswordEntryController: ViewController {
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) super.viewDidAppear(animated)
if let navigationController = self.navigationController as? NavigationController, let layout = self.validLayout {
addTemporaryKeyboardSnapshotView(navigationController: navigationController, parentView: self.view, layout: layout)
}
self.controllerNode.activateInput() self.controllerNode.activateInput()
} }

View File

@ -130,6 +130,10 @@ final class AuthorizationSequenceSignUpController: ViewController {
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) super.viewDidAppear(animated)
if let navigationController = self.navigationController as? NavigationController, let layout = self.validLayout {
addTemporaryKeyboardSnapshotView(navigationController: navigationController, parentView: self.view, layout: layout)
}
self.controllerNode.activateInput() self.controllerNode.activateInput()
} }

View File

@ -2,6 +2,7 @@ import Foundation
import UIKit import UIKit
import AsyncDisplayKit import AsyncDisplayKit
import Display import Display
import SwiftSignalKit
import TelegramPresentationData import TelegramPresentationData
import TextFormat import TextFormat
import Markdown import Markdown
@ -40,6 +41,8 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
private var layoutArguments: (ContainerViewLayout, CGFloat)? private var layoutArguments: (ContainerViewLayout, CGFloat)?
private let appearanceTimestamp = CACurrentMediaTime()
var currentName: (String, String) { var currentName: (String, String) {
return (self.firstNameField.textField.text ?? "", self.lastNameField.textField.text ?? "") return (self.firstNameField.textField.text ?? "", self.lastNameField.textField.text ?? "")
} }
@ -209,8 +212,16 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
} }
func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) {
let previousInputHeight = self.layoutArguments?.0.inputHeight ?? 0.0
let newInputHeight = layout.inputHeight ?? 0.0
self.layoutArguments = (layout, navigationBarHeight) self.layoutArguments = (layout, navigationBarHeight)
var layout = layout
if CACurrentMediaTime() - self.appearanceTimestamp < 2.0, newInputHeight < previousInputHeight {
layout = layout.withUpdatedInputHeight(previousInputHeight)
}
let maximumWidth: CGFloat = min(430.0, layout.size.width) let maximumWidth: CGFloat = min(430.0, layout.size.width)
var insets = layout.insets(options: [.statusBar]) var insets = layout.insets(options: [.statusBar])

View File

@ -2297,7 +2297,7 @@ public final class ChatListNode: ListView {
isEmpty = true isEmpty = true
loop1: for entry in transition.chatListView.filteredEntries { loop1: for entry in transition.chatListView.filteredEntries {
switch entry { switch entry {
case .GroupReferenceEntry, .HeaderEntry, .HoleEntry: case .HeaderEntry, .HoleEntry:
break break
default: default:
if case .ArchiveIntro = entry { if case .ArchiveIntro = entry {

View File

@ -612,7 +612,7 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
autoremoveTimeout: item.item.autoremoveTimeout, autoremoveTimeout: item.item.autoremoveTimeout,
forumTopicData: item.item.forumTopicData, forumTopicData: item.item.forumTopicData,
topForumTopicItems: item.item.topForumTopicItems, topForumTopicItems: item.item.topForumTopicItems,
revealed: threadId == 1 && (state.hiddenItemShouldBeTemporaryRevealed || state.editing) revealed: state.hiddenItemShouldBeTemporaryRevealed || state.editing
))) )))
if pinningIndex != 0 { if pinningIndex != 0 {
pinningIndex -= 1 pinningIndex -= 1
@ -632,7 +632,7 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
message: groupReference.topMessage, message: groupReference.topMessage,
editing: state.editing, editing: state.editing,
unreadCount: groupReference.unreadCount, unreadCount: groupReference.unreadCount,
revealed: state.hiddenItemShouldBeTemporaryRevealed, revealed: state.hiddenItemShouldBeTemporaryRevealed || view.items.isEmpty,
hiddenByDefault: hideArchivedFolderByDefault hiddenByDefault: hideArchivedFolderByDefault
)) ))
if pinningIndex != 0 { if pinningIndex != 0 {

View File

@ -1151,7 +1151,7 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro
} }
var canReport = true var canReport = true
if channel.isVerified || channel.adminRights != nil || channel.flags.contains(.isCreator) { if channel.adminRights != nil || channel.flags.contains(.isCreator) {
canReport = false canReport = false
} }

View File

@ -413,11 +413,7 @@ public final class WebSearchController: ViewController {
} }
} }
private func updateSearchQuery(_ query: String) { private func updateSearchQuery(_ query: String) {
if !query.isEmpty {
let _ = addRecentWebSearchQuery(engine: self.context.engine, string: query).start()
}
let scope: Signal<WebSearchScope?, NoError> let scope: Signal<WebSearchScope?, NoError>
switch self.mode { switch self.mode {
case .media: case .media: