【问题标题】:Keyboard will show notification does not work when i click on textview twice当我单击 textview 两次时,键盘将显示通知不起作用
【发布时间】:2019-01-10 13:45:24
【问题描述】:

我在屏幕顶部有一个文本视图,在屏幕底部有一个自定义视图,如工具栏。当用户点击文本视图时,键盘出现,工具栏随键盘一起上升。然后我在工具栏上有一个关闭按钮,它在 textview 上调用 endediting 函数。当我第二次单击 textview 时,工具栏没有出现,但我需要它出现。这是我附加到自定义工具栏上的代码:

extension UIView{
func bindToKeyboard(){
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

@objc func keyboardWillShow(_ notification: NSNotification){

    let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
    let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
    let beginningFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    let endFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
    let deltaY = endFrame.origin.y - beginningFrame.origin.y



    UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {

        if UIDevice().userInterfaceIdiom == .phone && UIScreen.main.nativeBounds.height == 2436 {//check user device
            //iPhone X
             self.frame.origin.y += deltaY + 35
        }else{
             self.frame.origin.y += deltaY
        }

    }, completion: nil)
}

@objc func keyboardWillHide(_ notification: NSNotification){
    let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
    let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
    let beginningFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    let endFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
    let deltaY = endFrame.origin.y - beginningFrame.origin.y



    UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {

        if UIDevice().userInterfaceIdiom == .phone && UIScreen.main.nativeBounds.height == 2436 {//check user device
            //iPhone X

            self.frame.origin.y = 0
        }else{
            self.frame.origin.y = 0
        }

    }, completion: nil)
}
}

这是键盘出现时我的文本视图的代码:

 override func viewDidLoad() {
    super.viewDidLoad()

    self.editView.bindToKeyboard()

   NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
     NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}



@objc func keyboardWillShow(_ notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
            textView.contentInset = contentInsets
        }
    }

@objc func keyboardWillHide(_ notification: NSNotification) {

        let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        textView.contentInset = contentInsets

}

【问题讨论】:

  • 可能会保存键盘的框架,然后在 viewDidLayoutSubviews() 中再次加载它。

标签: swift uitextview nsnotificationcenter uikeyboard


【解决方案1】:

对于键盘显示状态,使用 UIKeyboardWillShowNotification。

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

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 2018-02-14
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多