iOS 调整底部约束常数,当键盘可见在较新型号的 iPhone 上具有较大的偏移量时

iOS adjusting bottom constraint constant of view when keyboard visible has a larger offset on newer model iPhones

提问人:Zachary Bell 提问时间:5/25/2023 更新时间:5/25/2023 访问量:59

问:

我正在设置我的键盘将显示通知器,获取键盘高度,并在底部约束上设置常量值,如下所示:

通知观察者

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)

键盘将显示功能

@objc func keyboardWillShow(notification: NSNotification) {
    guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
        return
    }

    _keyboardHeight = keyboardFrame.cgRectValue.height
    changeStateContainerBottomConstraint.constant = _keyboardHeight
}

但是,在较新型号的手机上,我得到的值是将视图置于高于键盘顶部的位置,如下面的屏幕截图所示。我犹豫是否要用静态值调整约束,因为将来可能会发生变化,或者从一个模型到另一个模型。有没有人遇到过这个问题并有解决方案?

iPhone SE截图enter image description here

iPhone 14 Pro 截图enter image description here

iOS Swift 自动布局 通知中心

评论


答:

-2赞 Md. Sulayman 5/25/2023 #1

我建议你看看这个框架,它是处理这种东西的最流行的库。只需几行代码即可轻松使用,就像在 AppDelegate 文件中一样。https://github.com/hackiftekhar/IQKeyboardManagerIQKeyboardManager.shared.enable = true

评论

0赞 Zachary Bell 5/25/2023
我更喜欢本机解决方案。我过去发现,严重依赖第 3 部分库并不是很可持续。
0赞 Zachary Bell 5/25/2023 #2

看起来我已经找到了一个可行的解决方案。只需要找到安全区域插图的底部值,然后从返回的高度中减去它。这是现在的样子keyboardWillShow

 @objc func keyboardWillShow(notification: NSNotification) {
    guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
        return
    }

    _keyboardHeight = keyboardFrame.cgRectValue.height
    let bottom: CGFloat = UIApplication.shared.delegate?.window??.safeAreaInsets.bottom ?? 0
    changeStateContainerBottomConstraint.constant = _keyboardHeight - bottom
}

评论

0赞 HangarRash 5/25/2023
更简单的解决方案是使用 .有关示例,请参见 stackoverflow.com/a/69145739/20287183keyboardLayoutGuide