无法识别 GMSMapView 中子视图上的手势

Chr*_*ong 1 uigesturerecognizer ios uitapgesturerecognizer gmsmapview swift

我目前有一个带有 UIView 子视图的 GMSMapView,但我无法让子视图识别点击手势。我已经尝试了很多解决方案,比如设置isUserInteractionEnabled等于 true 和覆盖,delegate但到目前为止都没有奏效。

import UIKit
import GoogleMaps
class MapViewController: UIViewController, UIGestureRecognizerDelegate {
    var testView: UIView!
    var mapView: GMSMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let camera = GMSCameraPosition.camera(withLatitude: 0, longitude: 0, zoom: 15.0)
        mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
        mapView.isUserInteractionEnabled = true
        self.view = mapView

        let screenSize: CGRect = UIScreen.main.bounds
        let screenWidth = screenSize.width
        let screenHeight = screenSize.height

        testView = UIView()
        testView.backgroundColor = UIColor(white: 0, alpha: 0.5)
        testView.frame.origin = CGPoint(x: 0, y: 0);
        testView.frame.size = CGSize(width: screenWidth, height: screenHeight)
        testView.isUserInteractionEnabled = true

        let gesture = UITapGestureRecognizer(target: self, action: #selector(self.doSomething(_:)))
        gesture.numberOfTapsRequired = 1
        gesture.numberOfTouchesRequired = 1
        gesture.delegate = self
        self.view.addSubview(testView)
        testView.addGestureRecognizer(gesture)
    }

    @objc func doSomething(_ sender: UIGestureRecognizer) {
        print("doSomething")
    } 

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if (touch.view == gestureRecognizer.view) {
            print("returned true")
            return true
        }
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我点击 时testView,它确实从我的shouldReceiveTouch函数中打印出“returned true” 。所以我不太确定委托函数如何返回 true,但选择器函数没有触发。我还用另一个 UIView 尝试了这种滑动手势,但也没有奏效。任何帮助表示赞赏,在此先感谢您!

Sah*_*nda 5

放入以下代码:

mapView.settings.consumesGesturesInView = false
Run Code Online (Sandbox Code Playgroud)

来自谷歌地图 iOS SDK 参考

控制启用手势时用户的手势是否完全被 GMSMapView 使用(默认为 YES)。这可以防止这些手势被父视图接收。

当 GMSMapView 包含在 UIScrollView(或其他可滚动区域)中时,这意味着地图上的手势不会作为滚动手势额外消耗。但是,禁用此功能(设置为 NO)可能有助于支持复杂的视图层次结构或要求。