Browse Source

Fix toolbar safeArea for external keyboard

If an external keyboard is available, it will not show the software keyboard, displaying the toolbar au the bottom of the screen.
And the `inputAccessoryView` doesn't respect the safeArea: http://www.openradar.me/34411433

Signed-off-by: Henrik Storch <henrik.storch@nextcloud.com>
Henrik Storch 3 years ago
parent
commit
63090b2a7b

+ 31 - 0
iOSClient/Extensions/UIToolbar+Extension.swift

@@ -43,4 +43,35 @@ extension UIToolbar {
         toolbar.setItems(buttons, animated: false)
         return toolbar
     }
+
+    // by default inputAccessoryView does not respect safeArea
+    var wrappedSafeAreaContainer: UIView {
+        let view = InputBarWrapper()
+        view.addSubview(self)
+        self.translatesAutoresizingMaskIntoConstraints = false
+        NSLayoutConstraint.activate([
+            self.topAnchor.constraint(equalTo: view.topAnchor),
+            self.leftAnchor.constraint(equalTo: view.leftAnchor),
+            self.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
+            self.rightAnchor.constraint(equalTo: view.rightAnchor)
+        ])
+        return view
+    }
+}
+
+// https://stackoverflow.com/a/67985180/9506784
+class InputBarWrapper: UIView {
+
+    var desiredHeight: CGFloat = 0 {
+        didSet { invalidateIntrinsicContentSize() }
+    }
+
+    override var intrinsicContentSize: CGSize { CGSize(width: 0, height: desiredHeight) }
+
+    required init?(coder aDecoder: NSCoder) { fatalError() }
+
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        autoresizingMask = .flexibleHeight
+    }
 }

+ 1 - 1
iOSClient/Share/Advanced/NCShareCells.swift

@@ -284,7 +284,7 @@ class NCShareDateCell: UITableViewCell {
             self.onReload?()
         }
 
-        textField.inputAccessoryView = toolbar
+        textField.inputAccessoryView = toolbar.wrappedSafeAreaContainer
         textField.inputView = picker
 
         if let expDate = share.expirationDate {

+ 1 - 1
iOSClient/Share/Advanced/NCShareNewUserAddComment.swift

@@ -57,7 +57,7 @@ class NCShareNewUserAddComment: UIViewController, NCShareDetail {
             self.share.note = self.noteTextField.text
         }
 
-        noteTextField.inputAccessoryView = toolbar
+        noteTextField.inputAccessoryView = toolbar.wrappedSafeAreaContainer
 
         guard let headerView = (Bundle.main.loadNibNamed("NCShareAdvancePermissionHeader", owner: self, options: nil)?.first as? NCShareAdvancePermissionHeader) else { return }
         headerContainerView.addSubview(headerView)