Reputation: 996
I tried getting the height of the keyboard to update the table contentInsets when the keyboard shows up; but the notification from UIResponder.keyboardWillShowNotification
shows the frame with the safe area height. Is there a way to get the actual keyboard frame?
Code for the height of the keyboard height:
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardRectangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardRectangle.height
print("show: \(keyboardHeight)")
tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 18 + keyboardHeight, right: 0)
tableView.contentInset = UIEdgeInsets(top: 8, left: 0, bottom: 18 + keyboardHeight, right: 0)
}
But this gives the height of the following keyboard: https://i.sstatic.net/Y3uqk.jpg
What I want: https://i.sstatic.net/3xUbW.jpg
Upvotes: 4
Views: 2169
Reputation: 658
Try subtracting the height of the safe area's bottom inset when calculating the value for your constraint.
Here is a sample implementation which handles a UIKeyboardWillChangeFrame notification.
@objc private func keyboardWillChange(_ notification: Notification) {
guard let userInfo = (notification as Notification).userInfo, let value = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
let newHeight: CGFloat
if #available(iOS 11.0, *) {
newHeight = value.cgRectValue.height - view.safeAreaInsets.bottom
} else {
newHeight = value.cgRectValue.height
}
myConstraint.value = newHeight
}
Upvotes: 2
Reputation: 2805
First you have to get Safe Area bottom height and then exclude it from keyboard total height. In this way you will get only keyboard height without bottom safe area.
pesudo code:
let keyboardHeight = your keyboard height - bottomPadding
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
let bottomPadding = window?.safeAreaInsets.bottom
}
Hope it will help you.
Upvotes: 4