首页 > 解决方案 > 无法识别的选择器发送到实例 (UIPinchGestureRecognizer)

问题描述

我已经查看了有关此主题的先前线程,但我仍然无法找出解决方案。我已经做了几天了。

我正在尝试在相机预览屏幕上使用 PinchGestureRecognizer。

但是,我收到此错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[Testing.CameraViewController pinchActionWithGestureRecgnizer:]:无法识别的选择器发送到实例 0x10222d030”

这是我的设置:我为我的相机功能创建了一个单独的类。

class CameraSetup{

var captureSession = AVCaptureSession()
var frontCam : AVCaptureDevice?
var backCam : AVCaptureDevice?
var currentCam: AVCaptureDevice?
var captureInput: AVCaptureDeviceInput?
var captureOutput: AVCapturePhotoOutput?
 var cameraPreviewLayer: AVCaptureVideoPreviewLayer?

var oldZoomScale:CGFloat = 1.0


 //bunch of camera functions......followed by this function



@objc func pinchAction(gestureRecgnizer: UIPinchGestureRecognizer) {

    do { print("func started")
        try currentCam!.lockForConfiguration()
        print(currentCam?.videoZoomFactor)
        print(currentCam?.deviceType)

        // ズームの最大値
        let maxZoomScale: CGFloat = 6.0
        // ズームの最小値
        let minZoomScale: CGFloat = 1.0
        // 現在のカメラのズーム度
        var currentZoomScale: CGFloat = currentCam!.videoZoomFactor
        // ピンチの度合い
        let pinchZoomScale: CGFloat = gestureRecgnizer.scale
        // ピンチアウトの時、前回のズームに今回のズーム-1を指定

        // 例: 前回3.0, 今回1.2のとき、currentZoomScale=3.2

        if pinchZoomScale > 1.0 {

            currentZoomScale = oldZoomScale+pinchZoomScale-1

        } else {

            currentZoomScale = oldZoomScale-(1-pinchZoomScale)*oldZoomScale

        }

        // 最小値より小さく、最大値より大きくならないようにする
        if currentZoomScale < minZoomScale {
            currentZoomScale = minZoomScale
        }
        else if currentZoomScale > maxZoomScale {
            currentZoomScale = maxZoomScale

        }

        // 画面から指が離れたとき、stateがEndedになる。

        if gestureRecgnizer.state == .ended {

            oldZoomScale = currentZoomScale

        }

        currentCam?.videoZoomFactor = currentZoomScale

        defer {currentCam?.unlockForConfiguration()}

    } catch {

        // handle error

        return

    }

}

}

然后我尝试在我的cameraPreviewController

class CameraViewController :UIViewController {

    @IBOutlet weak var flashButtonImage: UIButton!

    @IBOutlet weak var cameraButton: UIButton!
    @IBOutlet weak var imagePreview: UIImageView!               
    var image: UIImage?    
    var cameraSetup: CameraSetup!

 func initializeCamera(){

    cameraSetup = CameraSetup()
    cameraSetup.captureDevice()
    cameraSetup.configureCaptureInput()
    cameraSetup.configureCaptureOutput()
    cameraSetup.configurePreviewLayer(view: imagePreview)



}

override func viewDidLoad() {
       super.viewDidLoad()
       applyRoundCorner(cameraButton)
       initializeCamera()

    let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(cameraSetup.pinchAction(gestureRecgnizer:)))

    print("testing")

    view.addGestureRecognizer(pinchGesture)

    }

我检查了插座的连接,但我没有看到有故障的连接,所以我认为这不是连接问题。如果你们建议,我会仔细看看。

太感谢了。

标签: iosswiftuigesturerecognizer

解决方案


你不能在一个类中做方法并在另一个地方改变目标

let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(cameraSetup.pinchAction(gestureRecgnizer:)))

let pinchGesture = UIPinchGestureRecognizer(target:cameraSetup, action: #selector(cameraSetup.pinchAction(gestureRecgnizer:)))

目标应包含选择器内的方法,无论您是创建cameraSetup还是self


推荐阅读