congnd / FMPhotoPicker

A modern, simple and zero-dependency photo picker with an elegant and customizable image editor
MIT License
762 stars 128 forks source link
crop effects filter image image-editor image-procesing ios photopicker photos picker swift video

FMPhotoPicker

MIT licensed Carthage compatible Pod Compatible Build

FMPhotoPicker is a modern, simple and zero-dependency photo picker with an elegant and customizable image editor

Quick demo

Batch select/deselect
Smooth transitions
Filter
Crop
FMPhotoPicker FMPhotoPicker FMPhotoPicker FMPhotoPicker

Features

Requirements

Installation

SwiftPM

dependencies: [
  .package(url: "https://github.com/congnd/FMPhotoPicker.git", .exact("1.3.0")),
]

Carthage

Insert the following line in your Carthfile:

git "git@github.com:congnd/FMPhotoPicker.git"

and run carthage update FMPhotoPicker

CocoaPods

FMPhotoPicker is now available in CocoaPods
You want to add pod 'FMPhotoPicker', '~> 1.3.0' similar to the following to your Podfile:

target 'MyApp' do
  pod 'FMPhotoPicker', '~> 1.3.0'
end

Then run a pod install inside your terminal.

Usage

Create a configuration object

var config = FMPhotoPickerConfig()

For details, see Configuration

Picker

let picker = FMPhotoPickerViewController(config: config)
picker.delegate = self
self.present(picker, animated: true)

From iOS 10, you have to add the Privacy - Photo Library Usage Description into your Info.plist file.

Editor

let editor = FMImageEditorViewController(config: config, sourceImage: image)
editor.delegate = self
self.present(editor, animated: true)

Delegation methods

If you prefer to receive selected photos in type of PHAsset instead of UIImage then don't forget to set the shouldReturnAsset to true and implement the corresponding delegation method.

Configuration

The configuration supports the following parameters:

Reference

You are not allowed to use the editor without giving it at least one crop option or one filter option

Customization

Custom filter

You can freely create your own filter by implementing the FMFilterable protocol.

public protocol FMFilterable {
    func filter(image: UIImage) -> UIImage
    func filterName() -> String
}

Be careful that the filterName is used to determine whether the two filters are the same.
Make sure that your filter's names are not duplicated, especially with the default filters that you want to use.

Custom cropping

Similar as filter function, FMPhotoPicker provides the capability to use your own cropping by implementing the FMCroppable protocol.

public protocol FMCroppable {
    func crop(image: UIImage, toRect rect: CGRect) -> UIImage
    func name(string: [String: String]) -> String
    func icon() -> UIImage
    func ratio() -> FMCropRatio?
}

The func name(strings: [String: String]) -> String will receive the strings configuration from configuration object. It allows you customize the cropping while keeping all your language setting in only one place.

The name() method is also used as identifier for the cropping.
Thus, make sure you do not have any duplicate of the cropping name.

Custom alert view controller

You can use your own view style for the confirmation view by implementing the FMAlertable protocol.

public protocol FMAlertable {
    func show(in viewController: UIViewController, ok: @escaping () -> Void, cancel: @escaping () -> Void)
}

Contact

Follow and contact me on Twitter. If you find an issue, just open a ticket. Pull requests are warmly welcome as well.

License

FMPhotoPicker is released under the MIT license. See LICENSE for details.