Yummypets
YPImagePicker
Swift

๐Ÿ“ธ Instagram-like image picker & filters for iOS

Last updated Jul 6, 2026
4.5k
Stars
1.0k
Forks
48
Issues
0
Stars/day
Attention Score
96
Language breakdown
No language data available.
โ–ธ Files click to expand
README


ypimagepicker

YPImagePicker

YPImagePicker is an instagram-like photo/video picker for iOS written in pure Swift. It is feature-rich and highly customizable to match your App's requirements.

Language: Swift 5 Version Platform SPM compatible codebeat badge License: MIT [GitHub tag]()

Installation - Configuration - Usage - Languages - UI Customization

Give it a quick try : pod repo update then pod try YPImagePicker

Those features are available just with a few lines of code!

Notable Features

๐ŸŒ… Library ๐Ÿ“ท Photo ๐ŸŽฅ Video โœ‚๏ธ Crop โšก๏ธ Flash ๐Ÿ–ผ Filters ๐Ÿ“ Albums ๐Ÿ”ข Multiple Selection ๐Ÿ“ Video Trimming & Cover selection ๐Ÿ“ Output image size And many more...

Installation

Using CocoaPods

First, be sure to run pod repo update to get the latest version available.

Add pod 'YPImagePicker' to your Podfile and run pod install. Also, add use_frameworks! to the Podfile.

target 'MyApp'
pod 'YPImagePicker'
use_frameworks!

Using Swift Package Manager

Open SPM dependency manager through File > Swift Packages > Add Package Dependency....

and insert repository URL:

`https://github.com/Yummypets/YPImagePicker.git

To add dependency in your own package, just specify a package in dependencies of your Package.swift: <pre><code class="lang-swift">.package( name: &quot;YPImagePicker&quot;, url: &quot;https://github.com/Yummypets/YPImagePicker.git&quot;, .upToNextMajor(from: &quot;5.0.0&quot;) )</code></pre> Note: This has a minimum target iOS version of 12.0.

Plist entries

In order for your app to access camera and photo libraries, you'll need to add these plist entries :

  • Privacy - Camera Usage Description (photo/videos)
  • Privacy - Photo Library Usage Description (library)
  • Privacy - Microphone Usage Description (videos)
<pre><code class="lang-xml">&lt;key&gt;NSCameraUsageDescription&lt;/key&gt; &lt;string&gt;yourWording&lt;/string&gt; &lt;key&gt;NSPhotoLibraryUsageDescription&lt;/key&gt; &lt;string&gt;yourWording&lt;/string&gt; &lt;key&gt;NSMicrophoneUsageDescription&lt;/key&gt; &lt;string&gt;yourWording&lt;/string&gt;</code></pre>

Configuration

All the configuration endpoints are in the YPImagePickerConfiguration struct. Below are the default value for reference, feel free to play around :)

<pre><code class="lang-swift">var config = YPImagePickerConfiguration() // [Edit configuration here ...] // Build a picker with your configuration let picker = YPImagePicker(configuration: config)</code></pre>

General

<pre><code class="lang-Swift">config.isScrollToChangeModesEnabled = true config.onlySquareImagesFromCamera = true config.usesFrontCamera = false config.showsPhotoFilters = true config.showsVideoTrimmer = true config.shouldSaveNewPicturesToAlbum = true config.albumName = &quot;DefaultYPImagePickerAlbumName&quot; config.startOnScreen = YPPickerScreen.photo config.screens = [.library, .photo] config.showsCrop = .none config.targetImageSize = YPImageSize.original config.overlayView = UIView() config.hidesStatusBar = true config.hidesBottomBar = false config.hidesCancelButton = false config.silentMode = true config.preferredStatusBarStyle = UIStatusBarStyle.default config.bottomMenuItemSelectedColour = UIColor(r: 38, g: 38, b: 38) config.bottomMenuItemUnSelectedColour = UIColor(r: 153, g: 153, b: 153) config.filters = [DefaultYPFilters...] config.maxCameraZoomFactor = 1.0 config.fonts..</code></pre>

Library

<pre><code class="lang-swift">config.library.options = nil config.library.onlySquare = false config.library.isSquareByDefault = true config.library.minWidthForItem = nil config.library.mediaType = YPlibraryMediaType.photo config.library.defaultMultipleSelection = false config.library.maxNumberOfItems = 1 config.library.minNumberOfItems = 1 config.library.numberOfItemsInRow = 4 config.library.spacingBetweenItems = 1.0 config.library.skipSelectionsGallery = false config.library.preselectedItems = nil config.library.preSelectItemOnMultipleSelection = true</code></pre>

Video

<pre><code class="lang-swift">config.video.compression = AVAssetExportPresetHighestQuality config.video.fileType = .mov config.video.recordingTimeLimit = 60.0 config.video.libraryTimeLimit = 60.0 config.video.minimumTimeLimit = 3.0 config.video.trimmerMaxDuration = 60.0 config.video.trimmerMinDuration = 3.0</code></pre>

Gallery

<pre><code class="lang-swift">config.gallery.hidesRemoveButton = false</code></pre>

Default Configuration

<pre><code class="lang-swift">// Set the default configuration for all pickers YPImagePickerConfiguration.shared = config

// And then use the default configuration like so: let picker = YPImagePicker()</code></pre>

When displaying picker on iPad, picker will support one size only you should set it before displaying it: <pre><code class="lang-">let preferredContentSize = CGSize(width: 500, height: 600); YPImagePickerConfiguration.widthOniPad = preferredContentSize.width;

// Now you can Display the picker with preferred size in dialog, popup etc</code></pre>

Usage

First things first import YPImagePicker.

The picker only has one callback didFinishPicking enabling you to handle all the cases. Let's see some typical use cases ๐Ÿค“

Single Photo

<pre><code class="lang-swift">let picker = YPImagePicker() picker.didFinishPicking { [unowned picker] items, _ in if let photo = items.singlePhoto { print(photo.fromCamera) // Image source (camera or library) print(photo.image) // Final image selected by the user print(photo.originalImage) // original image selected by the user, unfiltered print(photo.modifiedImage) // Transformed image, can be nil print(photo.exifMeta) // Print exif meta data of original image. } picker.dismiss(animated: true, completion: nil) } present(picker, animated: true, completion: nil)</code></pre>

Single video

<pre><code class="lang-swift">// Here we configure the picker to only show videos, no photos. var config = YPImagePickerConfiguration() config.screens = [.library, .video] config.library.mediaType = .video

let picker = YPImagePicker(configuration: config) picker.didFinishPicking { [unowned picker] items, _ in if let video = items.singleVideo { print(video.fromCamera) print(video.thumbnail) print(video.url) } picker.dismiss(animated: true, completion: nil) } present(picker, animated: true, completion: nil)</code></pre>

As you can see singlePhoto and singleVideo helpers are here to help you handle single media which are very common, while using the same callback for all your use-cases \o/

Multiple selection

To enable multiple selection make sure to set
library.maxNumberOfItems in the configuration like so: <pre><code class="lang-swift">var config = YPImagePickerConfiguration() config.library.maxNumberOfItems = 3 let picker = YPImagePicker(configuration: config)</code></pre> Then you can handle multiple selection in the same callback you know and love : <pre><code class="lang-swift">picker.didFinishPicking { [unowned picker] items, cancelled in for item in items { switch item { case .photo(let photo): print(photo) case .video(let video): print(video) } } picker.dismiss(animated: true, completion: nil) }</code></pre>

Handle Cancel event (if needed)

<pre><code class="lang-swift">picker.didFinishPicking { [unowned picker] items, cancelled in if cancelled { print(&quot;Picker was canceled&quot;) } picker.dismiss(animated: true, completion: nil) }</code></pre> That's it !

Languages

๐Ÿ‡บ๐Ÿ‡ธ English, ๐Ÿ‡ช๐Ÿ‡ธ Spanish, ๐Ÿ‡ซ๐Ÿ‡ท French ๐Ÿ‡ท๐Ÿ‡บ Russian, ๐Ÿ‡ต๐Ÿ‡ฑ Polish, ๐Ÿ‡ณ๐Ÿ‡ฑ Dutch, ๐Ÿ‡ง๐Ÿ‡ท Brazilian, ๐Ÿ‡น๐Ÿ‡ท Turkish, ๐Ÿ‡ธ๐Ÿ‡พ Arabic, ๐Ÿ‡ฉ๐Ÿ‡ช German, ๐Ÿ‡ฎ๐Ÿ‡น Italian, ๐Ÿ‡ฏ๐Ÿ‡ต Japanese, ๐Ÿ‡จ๐Ÿ‡ณ Chinese, ๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesian, ๐Ÿ‡ฐ๐Ÿ‡ท Korean, ๐Ÿ‡น๐Ÿ‡ผ Traditional Chinese๏ผˆTaiwan), ๐Ÿ‡ป๐Ÿ‡ณ Vietnamese, ๐Ÿ‡น๐Ÿ‡ญ Thai, ๐Ÿ‡จ๐Ÿ‡ฟ Czech, ๐Ÿ‡ฎ๐Ÿ‡ท Farsi.

If your language is not supported, you can still customize the wordings via the configuration.wordings api:

<pre><code class="lang-swift">config.wordings.libraryTitle = &quot;Gallery&quot; config.wordings.cameraTitle = &quot;Camera&quot; config.wordings.next = &quot;OK&quot;</code></pre> Better yet you can submit an issue or pull request with your Localizable.strings` file to add a new language !

UI Customization

We tried to keep things as native as possible, so this is done mostly through native Apis.

Navigation bar color

let coloredImage = UIImage(color: .red)
UINavigationBar.appearance().setBackgroundImage(coloredImage, for: UIBarMetrics.default)
// UIImage+color helper https://stackoverflow.com/questions/26542035/create-uiimage-with-solid-color-in-swift

Navigation bar fonts

let attributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 30, weight: .bold) ]
UINavigationBar.appearance().titleTextAttributes = attributes // Title fonts
UIBarButtonItem.appearance().setTitleTextAttributes(attributes, for: .normal) // Bar Button fonts

Navigation bar Text colors

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.yellow ] // Title color
UINavigationBar.appearance().tintColor = .red // Left. bar buttons
config.colors.tintColor = .green // Right bar buttons (actions)

Original Project & Author

This project has been first inspired by Fusuma Considering the big code, design changes, and all the additional features added along the way, this moved from a fork to a standalone separate repo, also for discoverability purposes. Original Fusuma author is ytakz

Core Team

Contributors ๐Ÿ™

ezisazis, hanikeddah, tahaburak, ajkolean, Anarchoschnitzel, Emil, Rafael Damasceno, cenkingunlugu heitara portellaa Romixery shotat shalamowww

Special thanks to ihtiht for the cool looking logo!

They helped us one way or another ๐Ÿ‘

userdar, Evgeniy, MehdiMahdloo, om-ha, userdar, ChintanWeapp, eddieespinal, viktorgardart, gdelarosa, cwestMobile, Tinyik, Vivekthakur647, tomasbykowski, artemsmikh, theolof, dongdong3344, MHX792, CIronfounderson, Guerrix, Zedd0202, mohammadZ74, SalmanGhumsani, wegweiser6, BilalAkram, KazimAhmad, JustinBeBoy, SashaMeyer, GShushanik, Cez95, Palando, sebastienboulogne, JigneshParekh7165, Deepakepaisa, AndreiBoariu, nathankonrad1, wawilliams003, pngo-hypewell, PawanManjani, devender54321, Didar1994, relaxsus restoflash

Dependency

YPImagePicker relies on prynt/PryntTrimmerView for provide video trimming and cover features. Big thanks to @HHK1 for making this open source :)

Obj-C support

Objective-C is not supported and this is not on our roadmap. Swift is the future and dropping Obj-C is the price to pay to keep our velocity on this library :)

License

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

Swift Version

  • Swift 3 -> version 1.2.0
  • Swift 4.1 -> version 3.4.1
  • Swift 4.2 -> version 3.5.2
releases/tag/3.4.0)
  • Swift 5.0 -> version 4.0.0
  • Swift 5.1 -> version 4.1.2
  • Swift 5.3 -> version 4.5.0

ยฉ 2026 GitRepoTrend ยท Yummypets/YPImagePicker ยท Updated daily from GitHub