使用建议栏获取键盘大小 swift

Get keyboard size with suggestion bar swift

在我的应用程序中,我需要在将其他组件移动到正确位置后获取键盘大小,现在我正在使用该代码获取高度

let info:NSDictionary = aNotification.userInfo! as NSDictionary
let kbSize:CGSize = (info.object(forKey: UIResponder.keyboardFrameEndUserInfoKey)! as AnyObject).cgRectValue.size
print(kbSize.height)

第一次打开键盘时结果是260.0,但这个值是默认大小,没有suggestions/passwords栏高,当我点击出来并再次点击输入时结果是304.0我想要的价值... 自第一次点击输入后如何获得 304?

您应该监听键盘大小的变化并以此方式调整其余内容,因为正如您发现的那样,iOS 键盘可以改变大小。您应该订阅 UIResponder.keyboardWillChangeFrameNotification and/or UIResponder.keyboardDidChangeFrameNotification 这些通知会在键盘框架将要或已经更改时触发。下面是一个使用示例:

// Somewhere in set up code
NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidChangeFrame),
    name: UIResponder.keyboardDidChangeFrameNotification, object: nil)

// Function elsewhere in your class
@objc func keyboardDidChangeFrame(_ notification: Notification) {
  guard let kbSize = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey]
      as? CGRect else {
    return;
  }

  // Use kbRect as you initially did
}

请注意,您可以使用 WillDid 通知,具体取决于您希望布局更改的外观。您还可以同时查询 UIResponder.keyboardFrameBeginUserInfoKey UIResponder.keyboardFrameEndUserInfoKey 以获取大小更改前后的键盘框架,如果您想将布局与键盘一起设置动画,这可能会很有用。

你可以试试这个;

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    }

    deinit {
        NotificationCenter.default.removeObserver(UIResponder.keyboardWillShowNotification)
        NotificationCenter.default.removeObserver(UIResponder.keyboardWillHideNotification)
        NotificationCenter.default.removeObserver(UIResponder.keyboardWillChangeFrameNotification)
    }

    @objc func keyboardWillChange(notification: Notification) {

        guard let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }

        if notification.name == UIResponder.keyboardWillChangeFrameNotification || notification.name == UIResponder.keyboardWillShowNotification {
            view.frame.origin.y = -keyboardSize.height
        } else {
            view.frame.origin.y = 0
        }
    }
}

这里是 Github gist