如何在Swift应用程序中正确处理相机的行为?

时间:2017-01-28 00:57:00

标签: ios swift swift3 avfoundation avcapturesession

在我的swift应用中,我允许用户拍照。

为此,我决定从这里使用CameraManagerhttps://github.com/imaginary-cloud/CameraManager

当用户打开我的应用程序时,他会看到一个按钮 - 当他按下按钮时,会出现相机视图,他可以拍照。他也可以关闭相机视图,稍后再按一下按钮再次打开相机视图。

如果我从插件文档中正确理解它,我需要在第一次使用时向我的视图添加一个摄像头视图,然后 - 如果被忽略 - 调用stopCaptureSession(),并在每次下一次使用调用期间{{1 }}

目前在我的resumeCaptureSession()代码中,我有三种方法:

swift

按钮的let cameraManager = CameraManager() fileprivate func addCameraToView() { cameraManager.addPreviewLayerToView(cameraView, newCameraOutputMode: CameraOutputMode.stillImage) } fileprivate func stopCaptureSession() { cameraManager.stopCaptureSession() } fileprivate func resumeCaptreSession() { cameraManager.resumeCaptureSession() } 具有以下代码:

IBAction

并且在let currentCameraState = cameraManager.currentCameraStatus() if currentCameraState == .notDetermined { cameraManager.askUserForCameraPermission({ permissionGranted in if permissionGranted { self.resumeCaptreSession() } }) } else if (currentCameraState == .ready) { self.resumeCaptreSession() } else { print("we do not have access to camera") } 的解雇按钮中我有:

IBAction

为了让它正常工作,我需要提前调用 print("cancelling camera") stopCaptureSession() - 直到现在我在addCameraToView()添加它,但我意识到我不能这样做,因为这样做 - 相机停留在用户按下viewDidLoad按钮之前有效。

所以我考虑在dismiss更改我的相机按钮代码并从那里添加相机。但是,我必须添加它,以防它之前没有添加 - 在另一种情况下我需要调用IBAction

问题是在resumeCaptureSession()中,负责将视频添加到视图的函数声明如下:

CameraManager

open func addPreviewLayerToView(_ view: UIView, newCameraOutputMode: CameraOutputMode) -> CameraState { return addLayerPreviewToView(view, newCameraOutputMode: newCameraOutputMode, completion: nil) } open func addLayerPreviewToView(_ view: UIView, newCameraOutputMode: CameraOutputMode, completion: ((Void) -> Void)?) -> CameraState { if _canLoadCamera() { if let _ = embeddingView { if let validPreviewLayer = previewLayer { validPreviewLayer.removeFromSuperlayer() } } if cameraIsSetup { _addPreviewLayerToView(view) cameraOutputMode = newCameraOutputMode if let validCompletion = completion { validCompletion() } } else { _setupCamera({ Void -> Void in self._addPreviewLayerToView(view) self.cameraOutputMode = newCameraOutputMode if let validCompletion = completion { validCompletion() } }) } } return _checkIfCameraIsAvailable() } 的定义如下:

resumeCaptureSession()

所以我的问题是 - 当用户打开相机视图时,如何检查相机是否已添加到视图中,如果已添加 - 请致电open func resumeCaptureSession() { if let validCaptureSession = captureSession { if !validCaptureSession.isRunning && cameraIsSetup { validCaptureSession.startRunning() _startFollowingDeviceOrientation() } } else { if _canLoadCamera() { if cameraIsSetup { stopAndRemoveCaptureSession() } _setupCamera({Void -> Void in if let validEmbeddingView = self.embeddingView { self._addPreviewLayerToView(validEmbeddingView) } self._startFollowingDeviceOrientation() }) } } } ,否则请不要调用它,只需将其保留打电话给resumeCaptureSession()

0 个答案:

没有答案