如何解决关闭键盘并允许按钮手势识别器 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 = false
和 shouldReceive
方法的建议,但它们都不起作用 - 在 shouldReceive
方法中,当我点击按钮时,{{ 1}} 是 touch.view
。
有谁知道如何让用户在点击屏幕上的任意位置时隐藏键盘,同时还允许执行按钮动作处理程序?
解决方法
我使用以下代码修复了这个问题:
-
我检测到用户触摸的位置
-
我检查触摸是否在我的
UIView
中的两个按钮的框架中 -
如果这是真的,我手动调用按钮处理程序并从方法中返回 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,object: nil)
NotificationCenter.default.removeObserver(self,object: nil)
}
override func viewDidDisappear(_ animated: Bool) {
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。