diff --git a/Tusker/Screens/Compose/ComposeHostingController.swift b/Tusker/Screens/Compose/ComposeHostingController.swift index d8fe99c5ea..0e3c2b6557 100644 --- a/Tusker/Screens/Compose/ComposeHostingController.swift +++ b/Tusker/Screens/Compose/ComposeHostingController.swift @@ -21,6 +21,9 @@ class ComposeHostingController: UIHostingController { 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 { 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 { 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 { 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 { } 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 { } -extension ComposeHostingController { - struct EnvironmentWrappingView: View { - let content: Content - let environmentObject: EnvironmentObject - - var body: some View { - content.environmentObject(environmentObject) - } - } -} - extension ComposeHostingController: ComposeUIStateDelegate { var assetPickerDelegate: AssetPickerViewControllerDelegate? { self }