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)
         toolbar.setItems(buttons, animated: false)
         return toolbar
         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?()
             self.onReload?()
         }
         }
 
 
-        textField.inputAccessoryView = toolbar
+        textField.inputAccessoryView = toolbar.wrappedSafeAreaContainer
         textField.inputView = picker
         textField.inputView = picker
 
 
         if let expDate = share.expirationDate {
         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
             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 }
         guard let headerView = (Bundle.main.loadNibNamed("NCShareAdvancePermissionHeader", owner: self, options: nil)?.first as? NCShareAdvancePermissionHeader) else { return }
         headerContainerView.addSubview(headerView)
         headerContainerView.addSubview(headerView)