首页 > 解决方案 > 如何使用我的 UITapGestureRecognizer 启用捏合手势?

问题描述

我有一个功能可以将上传的照片呈现到屏幕上,用户可以通过捏合来调整大小和平移。我的问题是,当加载第二张图像时,我无法再调整初始图像的大小,但它仍然可以平移。

我试图在handleTap函数中再次向发送者添加捏合手势,但没有成功。我将捏合手势保留在视图而不是 UIImageView 上,以便用户可以捏合屏幕上的任何位置以调整图像大小。

如何使用 tapGestureRecogniser 在当前为捏合手势启用的图像之间切换?

//MARK: - Render Art Methods:
    @objc func addPainting(_ notification: Notification) {
        if ArtBrain.artBrain.artArray.count > 0 {
            var artNo = 0
            ArtBrain.artBrain.artArray.count == 1 ? (artNo = 0) : (artNo = ArtBrain.artBrain.artArray.count - 1)
            pickedImageView = UIImageView(image: ArtBrain.artBrain.artArray[artNo].pickedImage)
            pickedImageView.isUserInteractionEnabled = true
            pickedImageView.isOpaque = true
            pickedImageView.contentMode = .scaleAspectFit
            pickedImageView.frame = CGRect(x: 0, y: 0, width: ArtBrain.artBrain.artArray[artNo].width ?? 100, height: ArtBrain.artBrain.artArray[artNo].height ?? 80)
            pickedImageView.center = CGPoint(x: userPickedRoom.center.x, y: userPickedRoom.center.y - 50)
            view.addSubview(pickedImageView)
            let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
            pickedImageView.addGestureRecognizer(panGesture)
            let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
            view.addGestureRecognizer(pinchGesture)
            pinchGesture.delegate = self
            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
            pickedImageView.addGestureRecognizer(tapGesture)
            addShadow()
        }
    }
    
    @objc func handlePan(_ sender: UIPanGestureRecognizer) {
        let translation = sender.translation(in: view)
        guard let gestureView = sender.view else {return}
        gestureView.center = CGPoint(x: gestureView.center.x + translation.x, y: gestureView.center.y + translation.y)
        sender.setTranslation(.zero, in: view)
    }
    
    @objc func handlePinch(_ sender: UIPinchGestureRecognizer) {
        guard sender.view != nil else { return }
        if sender.state == .began || sender.state == .changed {
            pickedImageView.transform = (pickedImageView.transform.scaledBy(x: sender.scale, y: sender.scale))
            sender.scale = 1.0
        }
    }
    
    @objc func handleTap(_ sender: UITapGestureRecognizer) {
        print(sender)
    }

标签: swiftuigesturerecognizer

解决方案


我解决了这个问题,并考虑发布我的解决方案以防其他人需要它。不确定这是否是最好的解决方案,所以如果有人有更好的解决方案,请分享。

我的问题是我无法访问每个图像,因此解决方案是:创建图像以将它们存储在数组中。我还需要添加一个标签,以便在 handleTap 函数中有一个要与之进行比较的值。我将为任何感兴趣的人发布工作代码。

    var selectedArt = 0
    var artArray = [UIImageView]()

    @objc func addPainting(_ notification: Notification) {
        if ArtBrain.artBrain.artArray.count > 0 {
            var artNo = 0
            ArtBrain.artBrain.artArray.count == 1 ? (artNo = 0) : (artNo = ArtBrain.artBrain.artArray.count - 1)
            pickedImageView = UIImageView(image: ArtBrain.artBrain.artArray[artNo].pickedImage)
            pickedImageView.tag = artNo
            selectedArt = artNo
            pickedImageView.isUserInteractionEnabled = true
            pickedImageView.isOpaque = true
            pickedImageView.contentMode = .scaleAspectFit
            pickedImageView.frame = CGRect(x: 0, y: 0, width: ArtBrain.artBrain.artArray[artNo].width ?? 100, height: ArtBrain.artBrain.artArray[artNo].height ?? 80)
            pickedImageView.center = CGPoint(x: userPickedRoom.center.x, y: userPickedRoom.center.y - 50)
            view.addSubview(pickedImageView)
            let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
            pickedImageView.addGestureRecognizer(panGesture)
            let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
            view.addGestureRecognizer(pinchGesture)
            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
            pickedImageView.addGestureRecognizer(tapGesture)
            artArray.append(pickedImageView)
            addShadow()
        }
    }
    
    @objc func handlePinch(_ sender: UIPinchGestureRecognizer) {
        guard sender.view != nil else {return}
        if sender.state == .began || sender.state == .changed {
            artArray[selectedArt].transform = (artArray[selectedArt].transform.scaledBy(x: sender.scale, y: sender.scale))
            sender.scale = 1.0
        }
    }
    
    @objc func handleTap(_ sender: UITapGestureRecognizer) {
        if sender.view != nil {
            selectedArt = sender.view!.tag
        }
    }

推荐阅读