单击 UIImageView SWIFT 不工作

On click UIImageView SWIFT not working

有一个名为 "imageView" 的对象,我需要在单击 "imageView" 时始终调用函数 "clicouCrosshair",但它不起作用。我尝试了一些在互联网上找到的不同教程,但没有成功。任何人都知道为什么以及我该如何解决这个问题?

我认为问题是因为我将我的视图用作 GMSMapView.. 在 "prepareMap" 函数中配置了 "UIImageView"。

import UIKit
import GoogleMaps

class Maps_criarArea: UIViewController {

    var projNome:String!;
    var mapView:GMSMapView!;

    var imageView:UIImageView!;

    func clicouCrosshair(sender: AnyObject){
        print("CROSSHAIR");
    }

    override func viewDidLoad() {
        super.viewDidLoad();


        GMSServices.provideAPIKey("AIzaSyB62KDZSGfbbN1IIVnlhewi4PpEZmxPJYM");


        let centerBR_lat = -15.30;
        let centerBR_lng = -49.57;

        let cameraP = GMSCameraPosition.cameraWithLatitude(centerBR_lat, longitude: centerBR_lng, zoom: 4);
        mapView = GMSMapView.mapWithFrame( CGRectZero, camera: cameraP)
        mapView.myLocationEnabled = true
        view = mapView;

        self.prepareMap();
    }

    func prepareMap(){

        let imageName = "crosshair";
        let image = UIImage(named: imageName);
        imageView = UIImageView(image: image!);

        let screenSize: CGRect = UIScreen.mainScreen().bounds;
        let WidthPosition = (screenSize.width*0.5)-32;
        let heightPosition = (screenSize.height*0.5)-32;

        imageView.frame = CGRect(x: WidthPosition, y: heightPosition, width: 64, height: 64);
        imageView.userInteractionEnabled = true;


        let detectTap = UITapGestureRecognizer(target: self, action: #selector(self.clicouCrosshair(_:))  )
        //detectTap.numberOfTapsRequired = 1


        imageView.addGestureRecognizer(detectTap)

        mapView.addSubview(imageView);







    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }



    //returning to view
    override func viewWillAppear(animated: Bool) {
        let saveBtn : UIBarButtonItem = UIBarButtonItem(title: "Salvar", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(Maps_criarArea.salvar(_:)) )
        self.navigationItem.rightBarButtonItem = saveBtn
    }

    func salvar(sender:UIBarButtonItem){

    }

}

您的 UIImageView 在您的 GMSMapView 中,您的点击始终由 GMSMapView 处理。尝试忽略 GMSMapView 中的点击并将其传递给 UIImageView。在您的视图中添加 UIGestureRecognizerDelegate 并使用委托方法 gestureRecognizerShouldBegin:。希望这有帮助。

如 mshresth 所述,问题出在触摸等手势的识别上。

为了解决这个问题,我改变了解决问题的方法,我没有尝试在包含地图的 UIView 中添加带有 GestureRecognizer 的图像,而是在主 UIView(视图)中添加了 UIView。

将地图添加为要查看的子视图:

    // PREPARA O MAPA
    let centerBR_lat = -15.30;
    let centerBR_lng = -49.57;
    let cameraP = GMSCameraPosition.cameraWithLatitude(centerBR_lat, longitude: centerBR_lng, zoom: 4);
    mapView = GMSMapView.mapWithFrame( CGRectZero, camera: cameraP)
    mapView.myLocationEnabled = true
    let screenSize: CGRect = UIScreen.mainScreen().bounds;
    mapView.frame = CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height);
    view.addSubview(mapView);

并使用 gestureRecognizer 添加图像:

    let imageName = "crosshair";
    let image = UIImage(named: imageName);
    let imageView:UIImageView = UIImageView(image: image!);
    imageView.userInteractionEnabled = true;
    imageView.frame = CGRect(x: (screenSize.width*0.5)-32, y: (screenSize.height*0.5)-32, width: 64, height: 64);
    let detectTap = UITapGestureRecognizer(target: self, action: #selector(Maps_criarArea.clicouCrosshair(_:))  )
    //detectTap.numberOfTapsRequired = 1
    imageView.addGestureRecognizer(detectTap)
    view.addSubview(imageView);

包含上面两个代码的函数只是将它们包含在其中。

这样我就可以添加地图、添加图像并在按下图像时调用函数

感谢所有帮助过的人

完整代码:

import UIKit
import GoogleMaps

class Maps_criarArea: UIViewController {

    var projNome:String!;
    var mapView:GMSMapView!;

    override func viewDidLoad() {

        super.viewDidLoad();


        GMSServices.provideAPIKey("AIzaSyB62KDZSGfbbN1IIVnlhewi4PpEZmxPJYM");

        self.prepareMap();
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func prepareMap(){



        // PREPARA O MAPA
        let centerBR_lat = -15.30;
        let centerBR_lng = -49.57;
        let cameraP = GMSCameraPosition.cameraWithLatitude(centerBR_lat, longitude: centerBR_lng, zoom: 4);
        mapView = GMSMapView.mapWithFrame( CGRectZero, camera: cameraP)
        mapView.myLocationEnabled = true
        let screenSize: CGRect = UIScreen.mainScreen().bounds;
        mapView.frame = CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height);
        view.addSubview(mapView);



        let imageName = "crosshair";
        let image = UIImage(named: imageName);
        let imageView:UIImageView = UIImageView(image: image!);
        imageView.userInteractionEnabled = true;
        imageView.frame = CGRect(x: (screenSize.width*0.5)-32, y: (screenSize.height*0.5)-32, width: 64, height: 64);
        let detectTap = UITapGestureRecognizer(target: self, action: #selector(Maps_criarArea.clicouCrosshair(_:))  )
        //detectTap.numberOfTapsRequired = 1
        imageView.addGestureRecognizer(detectTap)
        view.addSubview(imageView);

    }

    func clicouCrosshair(sender: AnyObject){
        print("CROSSHAIR");
    }





    //returning to view
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(true)
        let saveBtn : UIBarButtonItem = UIBarButtonItem(title: "Salvar", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(Maps_criarArea.salvar(_:)) )
        self.navigationItem.rightBarButtonItem = saveBtn
    }

    func salvar(sender:UIBarButtonItem){
        print("salvar");
    }


}