Awesome Open Source
Awesome Open Source

Camera Manager

CocoaPods Carthage compatible

This is a simple Swift class to provide all the configurations you need to create custom camera view in your app. It follows orientation change and updates UI accordingly, supports front and rear camera selection, pinch to zoom, tap to focus, exposure slider, different flash modes, inputs and outputs. Just drag, drop and use.

Installation with CocoaPods

The easiest way to install the CameraManager is with CocoaPods



pod 'CameraManager', '~> 4.4'

Installation with Swift Package Manager

The Swift Package Manager is a tool for managing the distribution of Swift code.

Add CameraManager as a dependency in your Package.swift file:

import PackageDescription

let package = Package(
    dependencies: [
        .Package(url: "", majorVersion: 4, minor: 3)

Installation with Carthage

Carthage is another dependency management tool written in Swift.

Add the following line to your Cartfile:

github "imaginary-cloud/CameraManager" >= 4.4

And run carthage update to build the dynamic framework.

How to use

To use it you just add the preview layer to your desired view, you'll get back the state of the camera if it's unavailable, ready or the user denied access to it. Have in mind that in order to retain the AVCaptureSession you will need to retain cameraManager instance somewhere, ex. as an instance constant.

let cameraManager = CameraManager()

To shoot image all you need to do is call:

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

To record video you call:

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

To zoom in manually:

let zoomScale = CGFloat(2.0)


You can set input device to front or back camera. (Default: .Back)

cameraManager.cameraDevice = .front || .back

You can specify if the front camera image should be horizontally fliped. (Default: false)

cameraManager.shouldFlipFrontCameraImage = true || false

You can enable or disable gestures on camera preview. (Default: true)

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

You can set output format to Image, video or video with audio. (Default: .stillImage)

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

You can set the quality. (Default: .high)

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

You can specify the focus mode. (Default: .continuousAutoFocus)

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

You can specifiy the exposure mode. (Default: .continuousAutoExposure)

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

You can change the flash mode (it will also set corresponding flash mode). (Default: .off)

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

You can specify the stabilisation mode to be used during a video record session. (Default: .auto)

cameraManager.videoStabilisationMode = .auto || .cinematic

You can enable location services for storing in Camera Roll. (Default: false)

cameraManager.shouldUseLocationServices = true || false

You can specify if you want to save the files to phone library. (Default: true)

cameraManager.writeFilesToPhoneLibrary = true || false

You can specify the album names for image and video recordings.

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

You can specify if you want to disable animations. (Default: true)

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

You can specify if you want the user to be asked about camera permissions automatically when you first try to use the camera or manually. (Default: true)

cameraManager.showAccessPermissionPopupAutomatically = true || false

To check if the device supports flash call:


To change flash mode to the next available one you can use this handy function which will also return current value for you to update the UI accordingly:


You can even setUp your custom block to handle error messages: It can be customized to be presented on the Window root view controller, for example.

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



Supports iOS 9 and above. Xcode 10.0 is required to build the latest code written in Swift 4.2.

Now it's compatible with latest Swift syntax, so if you're using any Swift version prior to 4.2 make sure to use one of the previously tagged releases:


Copyright © 2010-2018 Imaginary Cloud. This library is licensed under the MIT license.

About Imaginary Cloud

Imaginary Cloud

We apply our own Product Design Process to bring great digital products to life. Visit our website to find out about our other projects or contact us if there's an idea that you want to turn into an outstanding product, we'll take it from there!

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
swift (6,644
ios (2,969
cocoapods (510
carthage (304
camera (205
swift-package-manager (83
image-captioning (29
video-recording (20

Find Open Source By Browsing 7,000 Topics Across 59 Categories