如何获取实际键盘高度(键盘高度减去安全区域插图)

4

我尝试获取键盘的高度以便在键盘弹出时更新表格的内容偏移量,但是来自UIResponder.keyboardWillShowNotification通知的框架显示了带有安全区域高度的值。是否有一种方法可以获取实际的键盘框架?

获取键盘高度的代码:

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)
}

但这给出的是以下键盘的高度: https://imgur.com/m0HR088

我想要的是: https://imgur.com/Lp6vHOm

2个回答

3
首先,您需要获取安全区域底部高度,然后从键盘总高度中排除它。这样,您将只获得没有底部安全区域的键盘高度。
伪代码: let keyboardHeight = 您的键盘高度 - 底部填充
if #available(iOS 11.0, *) {
    let window = UIApplication.shared.keyWindow
    let bottomPadding = window?.safeAreaInsets.bottom
}

希望对你有所帮助。

2
尝试在计算约束值时减去安全区域底部插图的高度。 以下是处理UIKeyboardWillChangeFrame通知的示例实现。
@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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接