GestureRecognizer采用所有触摸输入

时间:2017-03-05 15:27:01

标签: ios iphone swift uigesturerecognizer

我的故事板中有此设置。

Storyboard

在我的第一个ViewController场景中,我有一个MapBox的MapView。在那里我放了一个TextField(AddressTextField)。在触摸视图时,在TextField上,我正在运行self.addressTextField.resignFirstResponder(),但在此之后,mapview或其中任何其他元素或嵌入式Segues中的任何元素都不会在触摸或单击时作出反应。可能这是因为我没有完全理解First Responder的系统。我很感谢你的每一个帮助。

编辑1: 我想我知道现在发生了什么,但我不知道如何解决它。当我将手势识别器添加到View(或mapView,这无关紧要)时,其他UIViews和MapView不再识别我的Tap-Gestures。当我没有添加识别器时,一切正常。似乎手势识别器正在识别我在UIViewsMapView上进行的每次点按,因此无法识别其他手势。

编辑2: 我刚刚向print()添加了dismissKeyboard()。只要在MapView或其他UIViews上识别出任何触摸事件,就会调用dismissKeyboard()。所以我认为我对Edit 1的想法是正确的。有谁知道我怎么能解决这个问题,所以不仅dismissKeyboard()被调用了?

一些代码:

func dismissKeyboard(){
     self.addressTextField.resignFirstResponder()
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
     dismissKeyboard()
     return true
}

//Class (only partially)
class ViewController: UIViewController, MGLMapViewDelegate, CLLocationManagerDelegate, UITextFieldDelegate {
     override func viewDidLoad(){
             mapView.delegate = self
             addressTextField.delegate = self
             let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
             self.mapView.addGestureRecognizer(tap)
     }
}

其他人只是@IBAction链接到按钮或其他元素。

2 个答案:

答案 0 :(得分:0)

试试这个:

func dismissKeyboard(){
    view.endEditing(true)
}
希望它有所帮助!

答案 1 :(得分:0)

在我知道真正的问题后,我能够解决问题。我宣布了var keyboardEnabled。然后我将这些行添加到我的班级。

class ViewController: UIViewController, UIGestureRecognizerDelegate {

var keyboardEnabled = false
    override func viewDidLoad(){
        super.viewDidLoad()
        //Looks for single tap
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
        self.mapView.addGestureRecognizer(tap) 
    }

    /* Setting keyboardEnabled */
    //Editing Target did end
    @IBAction func editingTargetDidEnd(_ sender: Any) {
        keyboardEnabled = false
    }

    //Editing TextField Started
    @IBAction func editingAdressBegin(_ sender: Any) {
        keyboardEnabled = true
    }

    //Call this function when the tap is recognized.
    func dismissKeyboard() {
        self.mapView.endEditing(true)
        keyboardEnabled = false
    }

    //Implementing the delegate method, so that I can add a statement
    //decide when the gesture should be recognized or not
    //Delegate Method of UITapGestureRecognizer
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        return keyboardEnabled
    }
}

使用此解决方案keyboardEnabled负责决定我的UIGestureRecognizer应该做出反应。如果识别器没有反应,则只需将手势传递给我的MapView中的UIViews或其他元素。

感谢您的所有答案!