Fix safe area on Compose screen not including keyboard on iOS 13
This commit is contained in:
parent
9a4ddfea3f
commit
b4ddb8f533
|
@ -21,6 +21,9 @@ class ComposeHostingController: UIHostingController<ComposeContainerView> {
|
|||
|
||||
private var cancellables = [AnyCancellable]()
|
||||
|
||||
private var keyboardHeight: CGFloat = 0
|
||||
private var toolbarHeight: CGFloat = 44
|
||||
|
||||
private var mainToolbar: UIToolbar!
|
||||
private var inputAccessoryToolbar: UIToolbar!
|
||||
private var visibilityBarButtonItems = [UIBarButtonItem]()
|
||||
|
@ -54,7 +57,7 @@ class ComposeHostingController: UIHostingController<ComposeContainerView> {
|
|||
NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidHide(_:)), name: UIResponder.keyboardDidHideNotification, object: nil)
|
||||
|
||||
// add the height of the toolbar itself to the bottom of the safe area so content inside SwiftUI ScrollView doesn't underflow it
|
||||
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: 44, right: 0)
|
||||
updateAdditionalSafeAreaInsets()
|
||||
|
||||
pasteConfiguration = UIPasteConfiguration(forAccepting: CompositionAttachment.self)
|
||||
|
||||
|
@ -125,6 +128,9 @@ class ComposeHostingController: UIHostingController<ComposeContainerView> {
|
|||
return toolbar
|
||||
}
|
||||
|
||||
private func updateAdditionalSafeAreaInsets() {
|
||||
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: toolbarHeight + keyboardHeight, right: 0)
|
||||
}
|
||||
|
||||
@objc private func keyboardWillShow(_ notification: Foundation.Notification) {
|
||||
keyboardWillShow(accessoryView: inputAccessoryToolbar, notification: notification)
|
||||
|
@ -135,6 +141,17 @@ class ComposeHostingController: UIHostingController<ComposeContainerView> {
|
|||
|
||||
accessoryView.alpha = 1
|
||||
accessoryView.isHidden = false
|
||||
|
||||
// on iOS 14, SwiftUI safe area automatically includes the keyboard
|
||||
if #available(iOS 14.0, *) {
|
||||
} else {
|
||||
let userInfo = notification.userInfo!
|
||||
let frame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! CGRect
|
||||
// temporarily reset add'l safe area insets so we can access the default inset
|
||||
additionalSafeAreaInsets = .zero
|
||||
keyboardHeight = frame.height - view.safeAreaInsets.bottom - accessoryView.frame.height
|
||||
updateAdditionalSafeAreaInsets()
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func keyboardWillHide(_ notification: Foundation.Notification) {
|
||||
|
@ -167,6 +184,13 @@ class ComposeHostingController: UIHostingController<ComposeContainerView> {
|
|||
} completion: { (finished) in
|
||||
accessoryView.alpha = 1
|
||||
}
|
||||
|
||||
// on iOS 14, SwiftUI safe area automatically includes the keyboard
|
||||
if #available(iOS 14.0, *) {
|
||||
} else {
|
||||
keyboardHeight = 0
|
||||
updateAdditionalSafeAreaInsets()
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func keyboardDidHide(_ notification: Foundation.Notification) {
|
||||
|
@ -242,17 +266,6 @@ class ComposeHostingController: UIHostingController<ComposeContainerView> {
|
|||
|
||||
}
|
||||
|
||||
extension ComposeHostingController {
|
||||
struct EnvironmentWrappingView<Content: View, EnvironmentObject: ObservableObject>: View {
|
||||
let content: Content
|
||||
let environmentObject: EnvironmentObject
|
||||
|
||||
var body: some View {
|
||||
content.environmentObject(environmentObject)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension ComposeHostingController: ComposeUIStateDelegate {
|
||||
var assetPickerDelegate: AssetPickerViewControllerDelegate? { self }
|
||||
|
||||
|
|
Loading…
Reference in New Issue