iPad 上的键盘高度不正确

Posted

技术标签:

【中文标题】iPad 上的键盘高度不正确【英文标题】:Keyboard height incorrect on iPad 【发布时间】:2019-01-17 15:17:24 【问题描述】:

我有一个UIView 固定在我的superview 底部。这有一个文本视图,在点击时会成为第一响应者。此时我检测到键盘将显示并更改其底部约束以将其向上移动,使其位于键盘上方。我使用以下代码:

private func keyboardWillShow(_ aNotification: Notification) 
    guard let info = (aNotification as NSNotification).userInfo,
        let endFrame = (info as NSDictionary).value(forKey: UIResponder.keyboardFrameEndUserInfoKey),
        let currentKeyboard = (endFrame as AnyObject).cgRectValue,
        let rate = info[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber
        else  return 

    let convertedFrame = self.view.convert(currentKeyboard, from: UIScreen.main.coordinateSpace)
    bottomConstraint.constant = self.view.frame.height - convertedFrame.origin.y

    UIView.animate(withDuration: rate.doubleValue) 
        self.view.layoutIfNeeded()
    

这在 iPhone 上运行良好。然而,在 iPad 上,它似乎向上移动了两倍的高度。这是为什么呢?

【问题讨论】:

请显示转换功能 @Scriptable 转换函数是苹果自己的:developer.apple.com/documentation/uikit/uicoordinatespace/… 啊!我不知道这种方法。我显然从来没有使用过它,但也从来没有需要,我通常用键盘向上移动我的视图。 func convert(_ point: CGPoint, from view: UIView?) -> CGPoint . 将一个点从给定视图的坐标系转换为接收者的坐标系。 【参考方案1】:

在转换键盘的框架时,您应该将nil 传递给from 参数。从窗口坐标正确转换(如UIView convert 文档中所述)。

如果您避免使用所有的 Objective-C 编码,您的代码也会更简单。

private func keyboardWillShow(_ aNotification: Notification) 
    guard let info = aNotification.userInfo,
        let endFrame = info[UIWindow.keyboardFrameEndUserInfoKey] as? NSValue,
        let rate = info[UIWindow.keyboardAnimationDurationUserInfoKey] as? NSNumber
        else  return 

    let currentKeyboard = endFrame.cgRectValue
    let convertedFrame = self.view.convert(currentKeyboard, from: nil)
    bottomConstraint.constant = self.view.frame.height - convertedFrame.origin.y

    UIView.animate(withDuration: rate.doubleValue) 
        self.view.layoutIfNeeded()
    

【讨论】:

以上是关于iPad 上的键盘高度不正确的主要内容,如果未能解决你的问题,请参考以下文章

iPad 上的 UIModalPresentationFormSheet。键盘出现时如何调整UITextView的高度

iPad屏幕键盘的高度是多少?

如何在 iOS 中计算键盘高度?

为啥 iPad 键盘高度在横向模式下是 1024 像素?

横幅高度而不是仅在 iPad 上的设备高度

iOS11 键盘问题 - 键盘高度不正确