ios - 无法识别的选择器发送到实例 (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)
}
我检查了插座的连接,但我没有看到有故障的连接,所以我认为这不是连接问题。如果你们建议,我会仔细看看。
太感谢了。
解决方案
你不能在一个类中做方法并在另一个地方改变目标
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(cameraSetup.pinchAction(gestureRecgnizer:)))
至
let pinchGesture = UIPinchGestureRecognizer(target:cameraSetup, action: #selector(cameraSetup.pinchAction(gestureRecgnizer:)))
目标应包含选择器内的方法,无论您是创建cameraSetup
还是self
推荐阅读
- nginx - 有时 502 Bad Gateway ,有时 504 网关超时,有时网站加载成功
- docker - 如何在非 SUSE 主机操作系统上的 SUSE 容器中运行 zypper 命令(如果可能的话?)
- react-native - 如何在启用滑动的情况下使用 createMaterialTopTabNavigator 时使用水平滚动视图,REACT NATIVE
- java - 这个 Jakarta Mail 代码究竟加密了什么,为什么收到的电子邮件被标记为未验证?
- c++ - 了解新的编码技术
- c# - Double Relation One to Many (different Property same Class), Unable to determine the relationship represented by navigation, C#
- python - 使用 pyspark 从 JSON DF 数组中删除选择性 JSON
- python - 如何过滤来自 django 网站的草稿内容?
- bash - for循环不同的%变量(跨不同的操作系统)
- angular - 前端的身份