关闭键盘并允许按钮手势识别器 Swift iOS

Dismiss Keyboard And Allow Button Gesture Recognizers Swift iOS

当用户点击屏幕上 TextView 之外的任意位置时,我使用此代码隐藏键盘:

 override func viewDidLoad() {
        super.viewDidLoad()
        //Looks for single or multiple taps.
        let tap = UITapGestureRecognizer(target: self, action: #selector(UIInputViewController.dismissKeyboard))
        tap.delegate = self
        //Uncomment the line below if you want the tap not not interfere and cancel other interactions.
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }
    
    //Calls this function when the tap is recognized.
    @objc func dismissKeyboard() {
        //Causes the view (or one of its embedded text fields) to resign the first responder status.
        view.endEditing(true)
    }
    
    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if touch.view is UIButton {
            return false
        }
        return true
    }

问题是我在此视图中也有一个 UIButton - 当我点击按钮时,不会调用按钮的手势识别功能。相反, dismissKeyboard 被调用。我已经尝试了使用 tap.cancelsTouchesInView = falseshouldReceive 方法的建议,但它们都不起作用 - 在 shouldReceive 方法中,当我点击按钮时, [=26= touch.view 的 ] 是 UIView

有谁知道如何允许用户在单击屏幕上的任意位置时隐藏键盘,同时允许执行按钮操作处理程序?

我使用以下代码解决了这个问题:

  1. 我检测到用户触摸的位置

  2. 我检查触摸是否在我 UIView

    中两个按钮中的每一个的框架内
  3. 如果这是 true,我手动调用按钮处理程序和 return false 从方法

    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
     if let view = self.view as? MyViewControllersView {
         let location = touch.location(in: self.view)
         if view.saveButton.frame.contains(location) {
             view.saveHit()
             return false
         } else if view.scanButton.frame.contains(location) {
             view.scanHit()
             return false
         }
     }
     return true
    }
    

对我有用,请查看

//MARK:- View Lyfe cycle
override func viewDidLoad() {
    super.viewDidLoad()
     IQKeyboardManager.shared().isEnableAutoToolbar = false
//        IQKeyboardManager.shared().disabledToolbarClasses = self
    IQKeyboardManager.shared().isEnabled = false
    self.keyboardWillShowAndHide()
    initializeHideKeyboard()
 }

//MARK:- KayBoard Handling...
//MARK:- Init Hide KeyBoard...
func initializeHideKeyboard(){
    //Declare a Tap Gesture Recognizer which will trigger our dismissMyKeyboard() function
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(
        target: self,
        action: #selector(dismissMyKeyboard))
    //Add this tap gesture recognizer to the parent view
    view.addGestureRecognizer(tap)
}
//MARK:- Dismissing Keyboard...
@objc func dismissMyKeyboard(){
    //endEditing causes the view (or one of its embedded text fields) to resign the first responder status.
    //In short- Dismiss the active keyboard.
    view.endEditing(true)
}
//MARK:- Kayboard Hide and Show...
func keyboardWillShowAndHide(){
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(keyboardWillShow),
        name: UIResponder.keyboardWillShowNotification,
        object: nil
    )
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(keyboarddidHide),
        name: UIResponder.keyboardWillHideNotification,
        object: nil
    )
    
}
//MARK:- KeyBoard Will Show
@objc func keyboardWillShow(_ notification: Notification) {
    self.arrConversationList.count
    if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight = keyboardRectangle.height
        self.ChatBottomConstraint.constant = keyboardHeight - self.bottomLayoutGuide.length
        DispatchQueue.main.asyncAfter(deadline: .now()+0.1, execute: {
            if  self.arrConversationList.count > 0 {
                let indexPath = NSIndexPath(row: self.arrConversationList.count-1, section: 0)
                self.ConversationTblref.scrollToRow(at: indexPath as IndexPath, at: .bottom, animated: true)
            }
        })
        self.tableviewbottomconstraintref.constant = 0
        ConversationTblref.reloadData()
    }
}
//MARK:- KeyBoard Will Hide
@objc func keyboarddidHide(_ notification: Notification) {
    self.tableviewbottomconstraintref.constant = 0
    self.ChatBottomConstraint.constant = 0
    ConversationTblref.reloadData()
}

//MARK:- View Disappear for handleing kayboard...
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    IQKeyboardManager.shared().isEnableAutoToolbar = true
    IQKeyboardManager.shared().isEnabled = true
     NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
    

}

override func viewDidDisappear(_ animated: Bool) {
   
}