获取键盘工具栏高度

Posted

技术标签:

【中文标题】获取键盘工具栏高度【英文标题】:Get Keyboard Toolbar Height 【发布时间】:2019-02-20 10:37:14 【问题描述】:

我有同样的问题: iPhone Keyboard with accessory view height problems

但答案没有新的解决方案,也没有解决任何问题!

【问题讨论】:

【参考方案1】:

我找到了一个很好的解决方案Here

做了一些更改并将其更新到 swift 4.2

需要说明的几点

    创建了从 Storyboard 到 ViewController 的文本字段和底部约束的出口 底部约束用于上下移动文本字段。
class ViewController: UIViewController 

    @IBOutlet weak var inputField: UITextField!

    @IBOutlet weak var textFieldBottomContraint: NSLayoutConstraint!
    override func viewDidLoad() 
        super.viewDidLoad()
        self.setUpKeyBoardNotifications()
        self.addToolBarTo(uiElement: self.inputField)
    
    func setUpKeyBoardNotifications()
    
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(self.keyboardNotification(notification:)),
                                               name: UIResponder.keyboardWillChangeFrameNotification,
                                               object: nil)
    
    func addToolBarTo(uiElement element:UITextField)
    
        let numberToolbar = UIToolbar(frame:CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 45))
        numberToolbar.barStyle = .black
        numberToolbar.items = [
            UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(ViewController.cancelAction)),
            UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
            UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ViewController.doneAction))]
        numberToolbar.sizeToFit()
       element.inputAccessoryView = numberToolbar

    
    @objc func keyboardNotification(notification: NSNotification) 
        if let userInfo = notification.userInfo 
            let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
            let endFrameY = endFrame?.origin.y ?? 0
            let duration:TimeInterval = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
            let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
            let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
            let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
            if endFrameY >= UIScreen.main.bounds.size.height 
                self.textFieldBottomContraint?.constant = 0.0
             else 
                self.textFieldBottomContraint?.constant = endFrame?.size.height ?? 0.0
            
            UIView.animate(withDuration: duration,
                           delay: TimeInterval(0),
                           options: animationCurve,
                           animations:  self.view.layoutIfNeeded() ,
                           completion: nil)
        
    
    @objc func cancelAction()
    
        self.inputField.resignFirstResponder()
    
   @objc func doneAction()
    
        self.inputField.resignFirstResponder()
    
    deinit 
        NotificationCenter.default.removeObserver(self)
    


【讨论】:

以上是关于获取键盘工具栏高度的主要内容,如果未能解决你的问题,请参考以下文章

Android开发常用工具总结

如何在 WPF 中获取工具窗口标题栏高度?

移动端输入框被手机键盘挡住

iOS键盘监听以及获取键盘高度

获取第三方键盘高度(包括自带键盘高度)

Qt实用技巧:将QWidget作为输入窗口,接收键盘消息输入法并且控制输入法悬浮工具栏位置控制