问题场景:
项目中一个 view 上有若干个可以点击的控件。同时有一个 textFiled(以下简称 TF),点击这个 TF 会弹出一个键盘用以输入,弹出键盘之后,如果想要点击屏幕任意的地方收起这个键盘。
常用思路是:
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
self.inputMoneyTF.resignFirstResponder()
}
但是这样 点击屏幕上其他可点击控件的地方时,响应的是那个可点击的控件。也就是说只能点击 view 上没有控件的地方才能收起键盘。
解决:
- - - - - > 当 textFiled 的代理是 viewController 时:
//通过添加一层视图,让这层 view 在响应者链条的顶端,这样在 touch 方法里响应的就是这层视图。
func textFieldDidBeginEditing(_ textField: UITextField) {
let tempView = UIView.init(frame: .init(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
self.tfTempView = tempView
self.view.addSubview(tempView)
}
//移除视图
func textFieldDidEndEditing(_ textField: UITextField) {
self.tfTempView?.removeFromSuperview()
}
//点击键盘上的 return 键收起键盘
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
return textField.resignFirstResponder()
}
- - - - - > 当 textFiled 的代理是 view 时:
func textFieldDidBeginEditing(_ textField: UITextField) {
let tempView = UIView.init(frame: .init(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
self.tfTempView = tempView
let tapGes = UITapGestureRecognizer.init(target: self, action: #selector(tfRegister))
self.tfTempView?.addGestureRecognizer(tapGes)
self.viewController().view.addSubview(tempView)//viewController()为获取当前 view 对应的 VC
}
@objc func tfRegister() {
self.varifiTF.resignFirstResponder()
self.markTF.resignFirstResponder()
self.amountInputTF.resignFirstResponder()
self.passwordTF.resignFirstResponder()
self.tfTempView?.removeFromSuperview()
}
网友评论