相机管理器

CocoaPods Carthage compatible

这是一个简单的 Swift 类,提供了在您的应用程序中创建自定义相机视图所需的所有配置。它会根据方向变化进行调整并相应地更新 UI,支持前后摄像头选择、捏合缩放、点击对焦、曝光滑块、不同的闪光灯模式、输入和输出以及二维码检测。只需拖放即可使用。

我们还写了一篇关于它的博文。您可以在这里阅读。

通过 CocoaPods 安装

安装 CameraManager 最简单的方法是使用 CocoaPods

Podfile

use_frameworks!

pod 'CameraManager', '~> 5.1'

通过 Swift Package Manager 安装

Swift Package Manager 是一个用于管理 Swift 代码分发的工具。

在您的 Package.swift 文件中添加 CameraManager 作为依赖项

import PackageDescription

let package = Package(
    dependencies: [
        .Package(url: "https://github.com/imaginary-cloud/CameraManager", from: "5.1.3")
    ]
)

通过 Carthage 安装

Carthage 是另一个用 Swift 编写的依赖管理工具。

将以下行添加到您的 Cartfile

github "imaginary-cloud/CameraManager" >= 5.1

并运行 carthage update 来构建动态框架。

如何使用

要使用它,只需将预览图层添加到您想要的视图,您将获得相机的状态,例如不可用、准备就绪或用户拒绝访问。请记住,为了保留 AVCaptureSession,您需要在某个地方保留 cameraManager 实例,例如作为一个实例常量。

let cameraManager = CameraManager()
cameraManager.addPreviewLayerToView(self.cameraView)

要拍摄照片,您只需调用

cameraManager.capturePictureWithCompletion({ result in
    switch result {
        case .failure:
            // error handling
        case .success(let content):
            self.myImage = content.asImage;
    }
})

要录制视频,您调用

cameraManager.startRecordingVideo()
cameraManager.stopVideoRecording({ (videoURL, recordError) -> Void in
    guard let videoURL = videoURL else {
        //Handle error of no recorded video URL
    }
    do {
        try FileManager.default.copyItem(at: videoURL, to: self.myVideoURL)
    }
    catch {
        //Handle error occured during copy
    }
})

手动缩放

let zoomScale = CGFloat(2.0)
cameraManager.zoom(zoomScale)

属性

您可以将输入设备设置为前置或后置摄像头。 (默认: .Back)

cameraManager.cameraDevice = .front || .back

您可以指定是否应水平翻转前置摄像头图像。 (默认: false)

cameraManager.shouldFlipFrontCameraImage = true || false

您可以启用或禁用相机预览上的手势。 (默认: true)

cameraManager.shouldEnableTapToFocus = true || false
cameraManager.shouldEnablePinchToZoom = true || false
cameraManager.shouldEnableExposure = true || false

您可以将输出格式设置为图像、视频或带有音频的视频。 (默认: .stillImage)

cameraManager.cameraOutputMode = .stillImage || .videoWithMic || .videoOnly

您可以根据 AVCaptureSession.Preset 值设置质量 (默认: .high)

cameraManager.cameraOutputQuality = .low || .medium || .high || *

*这里查看所有可能的值

您还可以检查是否可以设置特定的预设值

if .cameraManager.canSetPreset(preset: .hd1280x720) {
     cameraManager.cameraOutputQuality = .hd1280x720
} else {
    cameraManager.cameraOutputQuality = .high
}

您可以指定对焦模式。 (默认: .continuousAutoFocus)

cameraManager.focusMode = .autoFocus || .continuousAutoFocus || .locked

您可以指定曝光模式。 (默认: .continuousAutoExposure)

cameraManager.exposureMode = .autoExpose || .continuousAutoExposure || .locked || .custom

您可以更改闪光灯模式(它也会设置相应的闪光灯模式)。 (默认: .off)

cameraManager.flashMode = .off || .on || .auto

您可以指定在视频录制会话期间使用的防抖模式。 (默认: .auto)

cameraManager.videoStabilisationMode = .auto || .cinematic

您可以获取当前活动的视频防抖模式。如果视频防抖既不支持也不活动,它将返回 .off

cameraManager.activeVideoStabilisationMode

您可以启用位置服务,以便在保存到相机胶卷时存储 GPS 位置。 (默认: false)

cameraManager.shouldUseLocationServices = true || false

如果您使用位置信息,则必须将 NSLocationWhenInUseUsageDescription 键添加到应用程序的 Info.plist 中。更多信息

为了在调用 capturePictureWithCompletion 时获取 gps 位置,您应该使用 CaptureResult 作为 data(请参阅 示例应用程序)。

您可以指定是否要将文件保存到手机图库。 (默认: true)

cameraManager.writeFilesToPhoneLibrary = true || false

您可以指定图像和视频录制的相册名称。

cameraManager.imageAlbumName =  "Image Album Name"
cameraManager.videoAlbumName =  "Video Album Name"

您可以指定是否要禁用动画。 (默认: true)

cameraManager.animateShutter = true || false
cameraManager.animateCameraDeviceChange = true || false

您可以指定是否希望在您第一次尝试使用相机时自动询问用户关于相机权限,或者手动询问。 (默认: true)

cameraManager.showAccessPermissionPopupAutomatically = true || false

要检查设备是否支持闪光灯,请调用

cameraManager.hasFlash

要将闪光灯模式更改为下一个可用的模式,您可以使用此便捷功能,它还会返回当前值,以便您相应地更新 UI

cameraManager.changeFlashMode()

您甚至可以设置您的自定义块来处理错误消息:例如,它可以自定义为在 Window 根视图控制器上呈现。

cameraManager.showErrorBlock = { (erTitle: String, erMessage: String) -> Void in
    var alertController = UIAlertController(title: erTitle, message: erMessage, preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: { (alertAction) -> Void in
    }))

    let topController = UIApplication.shared.keyWindow?.rootViewController

    if (topController != nil) {
        topController?.present(alertController, animated: true, completion: { () -> Void in
            //
        })
    }

}

您可以设置是否要检测二维码

cameraManager.startQRCodeDetection { (result) in
    switch result {
    case .success(let value):
        print(value)
    case .failure(let error):
        print(error.localizedDescription)
    }
}

并且不要忘记在完成检测后调用 cameraManager.stopQRCodeDetection()

支持

支持 iOS 9 及以上版本。需要 Xcode 11.4 才能构建用 Swift 5.2 编写的最新代码。

现在它与最新的 Swift 语法兼容,因此如果您使用的任何 Swift 版本低于 5,请确保使用以前标记的发布版本之一

许可证

版权所有 © 2010-2020 Imaginary Cloud。 此库在 MIT 许可证下获得许可。

关于 Imaginary Cloud

Imaginary Cloud

在 Imaginary Cloud,我们构建世界一流的 Web 和移动应用程序。 我们的前端开发人员和 UI/UX 设计师已准备好创建或扩展您的数字产品。 查看我们的网站联系我们! 我们将从那里开始。