Programming language: Swift
License: MIT License
Tags: Hardware     Camera    
Latest version: v0.1.0

RAImagePicker alternatives and similar libraries

Based on the "Camera" category.
Alternatively, view RAImagePicker alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of RAImagePicker or a related project?

Add another 'Camera' Library



CI Status Version License Platform


RAImagePicker is a protocol-oriented framework that provides custom features from the built-in Image Picker Edit.


Object RAImagePickerController manages user interactions and delivers the results of those interactions to a delegate object.

RAImagePickerController depend on the configuration you set up before presenting it.

Functional Parts:

  1. Action Items(Default Asset.) - Supports two actions, this section is optional and by default contains action item for camera and photos.
  2. Camera - Camera's output(Capture Videos/Photos), this section is optinal and by default it's turned on.
  3. Asset. - Thumbnails of assets found in gallery, this section is mandatory and and can not be turned off.

Protocol Provide a delegate that conforms to RAImagePickerControllerDelegate protocol. Use delegate to get informed when user takes a picture or selects an asset from library and configure custom action and asset collection view cells.


Follow the following steps to get started:

  1. Add permissions to your info.plist file.
  2. Create new instance of RAImagePickerController.
  3. Present the controller Note: You can configure the controller by set Custom Cells, change Appearance and Layout and the Capture Mode


  • [x] Presentation Design Handeled for .horizontal(like iMessage) and .vertical Modes
  • [x] Portrait and Landscape Supported
  • [x] Support iPhone X
  • [x] Support Live Photos
  • [x] Flip Camera (Rear/Front)
  • [x] Highly and Easly Customisable Layout

Plist Privacy Permissions

In order to get access to the user Camera and Photos/Videos Gallery, you will need to add permissions to the plist file :

  • Privacy - Camera Usage Description (Photos/Videos)
  • Privacy - Photo Library Usage Description (Gallery)
  • Privacy - Microphone Usage Description (Videos)
<string>Access Description</string>
<string>Access Description</string>
<string>Access Description</string>

Capture Modes

Currently it supports capturing Photos, Live Photos and Videos.

To configure RAImagePicker to support desired media type use captureSettings struct. Use property cameraMode to specify what kind of output you are interested in.

  • [x] photo [Support Photos Only (Default)]
  • [x] video [Support Videos Only]
  • [x] photoAndLivePhoto [Support Photos & Live Photos]
  • [x] photoAndVideo [Support Videos & Photos]


let imagePicker = RAImagePickerController()
imagePicker.captureSettings.cameraMode = .photoAndLivePhoto

To save the captured photos to the gallery. Set the flag savesCapturedPhotosToPhotoLibrary to true.


let imagePicker = RAImagePickerController()
imagePicker.captureSettings.savesCapturedPhotosToPhotoLibrary = true


Default Image Picker fetches from Photo Library 1000 photos and videos from smart album smartAlbumUserLibrary that should represent Camera Roll album. If you wish to provide your own fetch result please implement image picker controller's assetsFetchResultBlock block.

For example the following code snippet can fetch only live photos:

let imagePicker = RAImagePickerController()
imagePicker.assetsFetchResultBlock = {
    guard let livePhotosCollection = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumLivePhotos, options: nil).firstObject else {
        return nil //you can return nil if you did not find desired fetch result, default fetch result will be used.
    return PHAsset.fetchAssets(in: livePhotosCollection, options: nil)

Reference Photos Framework.


Action Cells

  1. Set Layout Configuration

    let imagePicker = RAImagePickerController()
    imagePicker.layoutConfiguration.showsDefaultCameraItem  = true
    imagePicker.layoutConfiguration.showsDefaultGalleryItem = true
  2. Register Action Cells Now there's multiple ways to register your custom cells

  3. [x] Using nib

  4. [x] Using class

  5. [x] For specific item(nib)

    imagePicker.cellRegistrator.register(nib: CustomNib, forActionItemAt: 0) 
  6. [x] For specific item(class)

    imagePicker.cellRegistrator.register(nib: CustomCell, forActionItemAt: 0) 
  7. Configure Delegate

    func imagePicker(controller: RAImagePickerController, willDisplayActionItem cell: UICollectionViewCell, at index: Int) {
    switch cell {
    case let customCell as CustomCell:
        switch index {
        case 0:
            customCell.title.text = "Title"
            customCell.icon.image = UIImage(named: "icon_name")
        case 1:
            customCell.title.text = "Title"
            customCell.icon.image = UIImage(named: "icon_name")
        default: break
  8. Handle Selected Assets

    func imagePicker(controller: RAImagePickerController, didSelectActionItemAt index: Int) {
    print("Selected Asset. Index: \(index)")

Appearance Cells

  1. Register Cell Classes

    let imagePicker = RAImagePickerController()
    imagePicker.register(cellClass: CustomImageCell.self, forAssetItemOf: .image)
    imagePicker.register(cellClass: CustomVideoCell.self, forAssetItemOf: .video)

    Please note, that RACellRegistrator provides a method to register one cell or nib for any asset media type.

  2. Configure Delegate

    func imagePicker(controller: RAImagePickerController, willDisplayAssetItem cell: RAImagePickerAssetCell, asset: PHAsset) {
    switch cell {
    case let imageCell as CustomImageCell:
        if asset.mediaSubtypes.contains(.photoLive) {
            imageCell.subtypeImageView.image = UIImage(named: "icon_name")
        else if asset.mediaSubtypes.contains(.photoPanorama) {
            imageCell.subtypeImageView.image = UIImage(named: "icon_name")
        else if #available(iOS 10.2, *), asset.mediaSubtypes.contains(.photoDepthEffect) {
            imageCell.subtypeImageView.image = UIImage(named: "icon_name")
        // etc ...
    case let videoCell as CustomVideoCell:
        videoCell.label.text = asset.duration


let imagePicker = RAImagePickerController()
navigationController.present(imagePicker, animated: true, completion: nil)


To run the example project, clone the repo, and run pod install from the Example directory first.



  • Xcode +9.0
  • iOS 10.0+
  • Swift 4


RAImagePicker is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'RAImagePicker'


rallahaseh, [email protected]


RAImagePicker is available under the MIT license. See the LICENSE file for more info.

*Note that all licence references and agreements mentioned in the RAImagePicker README section above are relevant to that project's source code only.