无法识别的选择器发送到实例 (UIPinchGestureRecognizer)
Unrecognized Selector sent to instance (UIPinchGestureRecognizer)
我已经浏览过之前关于这个主题的帖子,但我仍然无法找到解决方案。我已经研究了几天了。
我正在尝试在相机预览屏幕上使用 PinchGestureRecognizer。
但是,我收到了这个错误:
Terminating app due to uncaught exception
'NSInvalidArgumentException', reason: '-[Testing.CameraViewController
pinchActionWithGestureRecgnizer:]: unrecognized selector sent to
instance 0x10222d030'
这是我的设置:
我为我的相机功能做了一个单独的class。
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)
}
我检查了插座连接,但没有发现有问题的连接,所以我认为这不是连接问题。
如果你们建议,我会仔细看看。
非常感谢。
你不能在 class 中执行方法并在另一个地方更改目标
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(cameraSetup.pinchAction(gestureRecgnizer:)))
到
let pinchGesture = UIPinchGestureRecognizer(target:cameraSetup, action: #selector(cameraSetup.pinchAction(gestureRecgnizer:)))
目标应该包含选择器中的方法,无论是 cameraSetup
还是 self
我已经浏览过之前关于这个主题的帖子,但我仍然无法找到解决方案。我已经研究了几天了。
我正在尝试在相机预览屏幕上使用 PinchGestureRecognizer。
但是,我收到了这个错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Testing.CameraViewController pinchActionWithGestureRecgnizer:]: unrecognized selector sent to instance 0x10222d030'
这是我的设置: 我为我的相机功能做了一个单独的class。
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)
}
我检查了插座连接,但没有发现有问题的连接,所以我认为这不是连接问题。 如果你们建议,我会仔细看看。
非常感谢。
你不能在 class 中执行方法并在另一个地方更改目标
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(cameraSetup.pinchAction(gestureRecgnizer:)))
到
let pinchGesture = UIPinchGestureRecognizer(target:cameraSetup, action: #selector(cameraSetup.pinchAction(gestureRecgnizer:)))
目标应该包含选择器中的方法,无论是 cameraSetup
还是 self