SKPhotoBrowser
Simple PhotoBrowser/Viewer inspired by facebook, twitter photo browsers written by swift
## features
- Display one or more images by providing either `UIImage` objects, or string of URL array.
- Photos can be zoomed and panned, and optional captions can be displayed
- Minimalistic Facebook-like interface, swipe up/down to dismiss
- Ability to custom control. (hide/ show toolbar for controls, / swipe control)
- Handling and caching photos from web
- Landscape handling
- Delete photo support(by offbye). By set displayDelete=true show a delete icon in statusbar, deleted indexes can be obtain from delegate func didDeleted
| Table/CollectionView sample | Button tap sample |
| ------------- | --------------- |
| ![sample](Screenshots/example01.gif) | ![sample](Screenshots/example02.gif) |
## Requirements
- iOS 8.0+
- Swift 2.0+
- ARC
### Version vs Swift version.
Below is a table that shows which version of SKPhotoBrowser you should use for your Swift version.
| Swift version | SKPhotoBrowser version |
| ------------- | --------------- |
| 5.0 | >= 6.1.0 |
| 4.2 | >= 6.0.0 |
| 4.1 | >= 5.0.0 |
| 3.2 | >= 4.0.0 |
| 2.3 | 2.0.4 - 3.1.4 |
| 2.2 | <= 2.0.3 |
## Installation
#### CocoaPods
available on CocoaPods. Just add the following to your project Podfile:
```
pod 'SKPhotoBrowser'
use_frameworks!
```
#### Carthage
To integrate into your Xcode project using Carthage, specify it in your Cartfile:
```ogdl
github "suzuki-0000/SKPhotoBrowser"
```
## Usage
See the code snippet below for an example of how to implement, or see the example project.
from UIImages:
```swift
// 1. create SKPhoto Array from UIImage
var images = [SKPhoto]()
let photo = SKPhoto.photoWithImage(UIImage())// add some UIImage
images.append(photo)
// 2. create PhotoBrowser Instance, and present from your viewController.
let browser = SKPhotoBrowser(photos: images)
browser.initializePageIndex(0)
present(browser, animated: true, completion: {})
```
from URLs:
```swift
// 1. create URL Array
var images = [SKPhoto]()
let photo = SKPhoto.photoWithImageURL("https://placehold.jp/150x150.png")
photo.shouldCachePhotoURLImage = false // you can use image cache by true(NSCache)
images.append(photo)
// 2. create PhotoBrowser Instance, and present.
let browser = SKPhotoBrowser(photos: images)
browser.initializePageIndex(0)
present(browser, animated: true, completion: {})
```
from local files:
```swift
// 1. create images from local files
var images = [SKLocalPhoto]()
let photo = SKLocalPhoto.photoWithImageURL("..some_local_path/150x150.png")
images.append(photo)
// 2. create PhotoBrowser Instance, and present.
let browser = SKPhotoBrowser(photos: images)
browser.initializePageIndex(0)
present(browser, animated: true, completion: {})
```
If you want to use zooming effect from an existing view, use another initializer:
```swift
// e.g.: some tableView or collectionView.
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
let cell = collectionView.cellForItemAtIndexPath(indexPath)
let originImage = cell.exampleImageView.image // some image for baseImage
let browser = SKPhotoBrowser(originImage: originImage ?? UIImage(), photos: images, animatedFromView: cell)
browser.initializePageIndex(indexPath.row)
present(browser, animated: true, completion: {})
}
```
### Custom
#### Toolbar
You can customize Toolbar via SKPhotoBrowserOptions.
```swift
SKPhotoBrowserOptions.displayToolbar = false // all tool bar will be hidden
SKPhotoBrowserOptions.displayCounterLabel = false // counter label will be hidden
SKPhotoBrowserOptions.displayBackAndForwardButton = false // back / forward button will be hidden
SKPhotoBrowserOptions.displayAction = false // action button will be hidden
SKPhotoBrowserOptions.displayHorizontalScrollIndicator = false // horizontal scroll bar will be hidden
SKPhotoBrowserOptions.displayVerticalScrollIndicator = false // vertical scroll bar will be hidden
let browser = SKPhotoBrowser(originImage: originImage, photos: images, animatedFromView: cell)
```
#### Colors
You can customize text, icon and background colors via SKPhotoBrowserOptions or SKToolbarOptions
```swift
SKPhotoBrowserOptions.backgroundColor = UIColor.whiteColor() // browser view will be white
SKPhotoBrowserOptions.textAndIconColor = UIColor.blackColor() // text and icons will be black
SKToolbarOptions.textShadowColor = UIColor.clearColor() // shadow of toolbar text will be removed
SKToolbarOptions.font = UIFont(name: "Futura", size: 16.0) // font of toolbar will be 'Futura'
```
#### Images
You can customize the padding of displayed images via SKPhotoBrowserOptions
```swift
SKPhotoBrowserOptions.imagePaddingX = 50 // image padding left and right will be 25
SKPhotoBrowserOptions.imagePaddingY = 50 // image padding top and bottom will be 25
```
#### Statusbar
You can customize the visibility of the Statusbar in browser view via SKPhotoBrowserOptions
```swift
SKPhotoBrowserOptions.displayStatusbar = false // status bar will be hidden
```
#### Close And Delete Buttons
That how you can customize close and delete buttons
```
SKPhotoBrowserOptions.displayDeleteButton = true // delete button will be shown
SKPhotoBrowserOptions.swapCloseAndDeleteButtons = true // now close button located on right side of screen and delete button is on left side
SKPhotoBrowserOptions.closeAndDeleteButtonPadding = 20 // set offset from top and from nearest screen edge of close button and delete button
```
#### Custom Cache From Web URL
You can use SKCacheable protocol if others are adaptable. (SKImageCacheable or SKRequestResponseCacheable)
```swift
e.g. SDWebImage
// 1. create custom cache, implement in accordance with the protocol
class CustomImageCache: SKImageCacheable { var cache: SDImageCache }
// 2. replace SKCache instance with custom cache
SKCache.sharedCache.imageCache = CustomImageCache()
```
#### CustomButton Image
Close, Delete buttons are able to change image and frame.
``` swift
browser.updateCloseButton(UIImage())
browser.updateUpdateButton(UIImage())
```
#### Delete Photo
You can delete your photo for your own handling. detect button tap from `removePhoto` delegate function.
#### Photo Captions
Photo captions can be displayed simply bottom of PhotoBrowser. by setting the `caption` property on specific photos:
``` swift
let photo = SKPhoto.photoWithImage(UIImage())
photo.caption = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."
```
#### SwipeGesture
vertical swipe can enable/disable:
``` swift
SKPhotoBrowserOptions.disableVerticalSwipe = true
```
#### Delegate
There's some trigger point you can handle using delegate. those are optional.
See [SKPhotoBrowserDelegate](https://github.com/suzuki-0000/SKPhotoBrowser/blob/master/SKPhotoBrowser/SKPhotoBrowserDelegate.swift) for more details.
- didShowPhotoAtIndex(_ index:Int)
- willDismissAtPageIndex(_ index:Int)
- willShowActionSheet(_ photoIndex: Int)
- didDismissAtPageIndex(_ index:Int)
- didDismissActionSheetWithButtonIndex(_ buttonIndex: Int, photoIndex: Int)
- didScrollToIndex(_ index: Int)
- removePhoto(_ browser: SKPhotoBrowser, index: Int, reload: (() -> Void))
- viewForPhoto(_ browser: SKPhotoBrowser, index: Int) -> UIView?
- controlsVisibilityToggled(_ browser: SKPhotoBrowser, hidden: Bool)
```swift
let browser = SKPhotoBrowser(originImage: originImage, photos: images, animatedFromView: cell)
browser.delegate = self
// MARK: - SKPhotoBrowserDelegate
func didShowPhotoAtIndex(_ index: Int) {
// when photo will be shown
}
func willDismissAtPageIndex(_ index: Int) {
// when PhotoBrowser will be dismissed
}
func didDismissAtPageIndex(_ index: Int) {
// when PhotoBrowser did dismissed
}
```
#### Options
You can access via `SKPhotoBrowserOptions`, which can use for browser control.
See [SKPhotoBrowserOptions](https://github.com/suzuki-0000/SKPhotoBrowser/blob/master/SKPhotoBrowser/SKPhotoBrowserOptions.swift) for more details.
- single tap handling, dismiss/noaction
- blackArea handling which is appearing outside of photo
- bounce animation when appearing/dismissing
- text color, font, or more
``` swift
SKPhotoBrowserOptions.enableZoomBlackArea = true // default true
SKPhotoBrowserOptions.enableSingleTapDismiss = true // default false
```
## Photos from
- [Unsplash](https://unsplash.com)
## License
available under the MIT license. See the LICENSE file for more info.
## Contributors
Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)):
| [
Alexander Khitev](https://github.com/alexanderkhitev)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=alexanderkhitev "Code") | [
K Rummler](https://github.com/krummler)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=krummler "Code") | [
Mads Bjerre](http://wisekopf.com)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=madsb "Code") | [
Meng Ye](https://jk2K.com)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=jk2K "Code") | [
_ant_one](https://github.com/barrault01)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=barrault01 "Code") | [
Tim Roesner](http://timroesner.com)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=timroesner "Code") | [
θ₯ε₯](http://www.zxming.com)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=zxming "Code") |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| [
Kevin Wolkober](http://kevinwo.github.io)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=kevinwo "Code") | [
PJ Gray](http://www.saygoodnight.com/)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=pj4533 "Code") | [
ghysrc](https://github.com/ghysrc)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=ghysrc "Code") | [
Josef DoleΕΎal](http://josefdolezal.github.com)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=josefdolezal "Code") | [
Mark Goody](https://marramgrass.micro.blog/)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=marramgrass "Code") | [
Philippe Riegert](https://github.com/PhilippeRiegert)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=PhilippeRiegert "Code") | [
Bryan Irace](http://irace.me)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=irace "Code") |
| [
dirtmelon](https://github.com/dirtmelon)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=dirtmelon "Code") | [
Heberti Almeida](https://dribbble.com/hebertialmeida)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=hebertialmeida "Code") | [
Felix Weiss](http://othellogame.net)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=appsunited "Code") | [
.Some](https://github.com/BigDanceMouse)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=BigDanceMouse "Code") | [
Onur Var](https://tr.linkedin.com/in/onur-var)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=OnurVar "Code") | [
Andrew Barba](https://abarba.me)
[π»](https://github.com/suzuki-0000/SKPhotoBrowser/commits?author=AndrewBarba "Code") |
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!