我有多个键盘触发元素...UITextField
、UITextView
和 UISearchBar
。
我想在触摸除键盘和当前事件的“文本编辑”元素之外的任何地方时关闭 UIKeyboard
。
我已经实现了
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
searchBar.resignFirstResponder()
name.resignFirstResponder() //UITextField
notes.resignFirstResponder() //UITextView
self.view.endEditing(true)
}
如果用户点击“惰性”元素...背景或 userDisabledView...这会起作用,但我的大部分 View 都是由“事件”元素组成的,例如 UITableView
和 UIButtons
...
有没有办法使这成为可能,无论在何处进行点击。
我知道的唯一方法是使用一个大的不可见按钮,当 UIKeyboard
出现时,它会在 View 上滑动,调用 self.view.endEditing(true)
,然后缩回到屏幕外。
有什么帮助吗?
注意:我通过在 didSelectRowAtIndexPath
中实现 self.view.endEditing(true)
解决了如果 tap 在 UITableView 上的问题,仍然想听听其他方法休息
最佳答案
//currently active "text editing" element.
var firstResponderView : UIView?
var tap: UITapGestureRecognizer?
//cover the currently active "text editing" element.
var smallView:UIView?
//dont't cover the keyboard
var bigView: UIView?
func createView(){
bigView = UIView(frame: CGRectZero)
bigView!.userInteractionEnabled=false
tap = UITapGestureRecognizer(target: self, action: "endEditing")
smallView = UIView(frame: CGRectZero)
smallView!.userInteractionEnabled=false
bigView!.addSubview(smallView!)
self.view.addSubview(bigView!)
self.update()
}
func endEditing(){
self.view.endEditing(true)
self.update()
}
//call this after any view become first responder or resign
func update() {
if(firstResponderView?.isFirstResponder()==true)
{
bigView!.addGestureRecognizer(tap!)
bigView!.userInteractionEnabled = true
smallView!.frame = firstResponderView!.frame
}
else{
bigView!.removeGestureRecognizer(tap!)
bigView!.userInteractionEnabled = false
smallView!.frame=CGRectZero
}
}
关于ios - 在点击任何 UIControl 对象时关闭键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30388641/