ios - 制作自定义相机,在我的应用程序委托(delegate)中收到 "Thread 1: signal SIGBRT"错误

标签 ios swift xcode error-handling camera

我正在制作一个定制相机。我有 2 个用于相机的 View Controller (一个用于实际捕获,另一个用于照片预览)。这是每个代码,我已经检查过但没有发现任何错误!我的 XCODE 项目是启用了 CoreData 的单一 View 。编辑:我已经添加了适当的 Info.Plist 相机权限。

下面是我用于拍照的 ViewController:

 import UIKit
import AVFoundation

class ViewController: UIViewController {

    var captureSession = AVCaptureSession()

    var backCamera: AVCaptureDevice?
    var frontCamera: AVCaptureDevice?
    var currentCamera: AVCaptureDevice?

    var photoOutput: AVCapturePhotoOutput?

    var cameraPreviewlayer: AVCaptureVideoPreviewLayer?

    var image: UIImage?

    override func viewDidLoad() {
        super.viewDidLoad()

        setupCaptureSession()
        setupDevice()
        setupInputOutput()
        setupPreviewLayer()
        startRunningCaptureSession()

        // Do any additional setup after loading the view, typically from a nib.
    }

    func setupCaptureSession() {
        captureSession.sessionPreset = AVCaptureSession.Preset.photo
    }

    func setupDevice() {
        let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)

        let devices = deviceDiscoverySession.devices

        for device in devices {
            if device.position == AVCaptureDevice.Position.back {
                backCamera = device
            } else if device.position == AVCaptureDevice.Position.front {
                frontCamera = device
            }
        }

        currentCamera = backCamera
    }

    func setupInputOutput() {
        do {
            let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!)
            captureSession.addInput(captureDeviceInput)
            photoOutput = AVCapturePhotoOutput()
            photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
            captureSession.addOutput(photoOutput!)
        } catch {
            print(error)
        }
    }

    func setupPreviewLayer(){
        cameraPreviewlayer = AVCaptureVideoPreviewLayer(session: captureSession)
        cameraPreviewlayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        cameraPreviewlayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
        cameraPreviewlayer?.frame = self.view.frame
        self.view.layer.insertSublayer(cameraPreviewlayer!, at: 0)
    }

    func startRunningCaptureSession() {
        captureSession.startRunning()
    }

    @IBAction func CameraButton_TouchUpInside(_ sender: Any) {
        let settings = AVCapturePhotoSettings()

        photoOutput?.capturePhoto(with: settings, delegate: self)

       // performSegue(withIdentifier: "showPhoto_Segue", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showPhoto_Segue" {
            let previewVC = segue.destination as! PreviewViewController
            previewVC.image = self.image
        }
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }

}

extension ViewController: AVCapturePhotoCaptureDelegate{
    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        if let imageData = photo.fileDataRepresentation() {
            print(imageData)
            image = UIImage(data: imageData)
            performSegue(withIdentifier: "showPhoto_Segue", sender: nil)
        }
    }


}

这是我的预览代码,当我按下用户刚刚捕获的“取消”或“保存”按钮时,会发生错误:

    import UIKit

class PreviewViewController: UIViewController {

    @IBOutlet weak var photo: UIImageView!

    var image: UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()
        photo.image = self.image

    }

    @IBAction func cancelButton_TouchUpInside(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }

    @IBAction func saveButton_TouchUpInside(_ sender: Any) {

    }

    override var prefersStatusBarHidden: Bool {
        return true
    }

}

我没有在 AppDelegate 中更改或添加任何代码。这是 XCODE 9 和 Swift 4 中的内容。感谢您的帮助。

最佳答案

您的代码没问题,只是忘记在 info.plist 文件中请求相机使用权限,添加此“隐私 - 相机使用说明”

关于ios - 制作自定义相机,在我的应用程序委托(delegate)中收到 "Thread 1: signal SIGBRT"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51698479/

相关文章:

objective-c - 无法在 AppController 中导入 firebase

ios - 对可编辑文本禁用某些 UITextView 操作

ios - 通过 AVMetadataMachineReadableCodeObject 从 Aztec 条码读取原始字节会产生意外结果

ios - 无法将类型 '(Result<Model>) -> Void' 的值转换为预期参数类型 '(Result<_>) -> Void'

ios - 将 View Controller 主视图(self.view) subview 移动到 ScrollView

iPhone : How to remove right button from navigation bar in a view controller?

android - Flutter RTL AppBar 图标位置

android - 无法在我的 Mac 上设置 IBM Worklight

iOS 测试和 UITests 混淆

ios - 如何检测用户是否在我的应用程序中为本地通知设置了横幅样式警报或 'normal' 样式警报?