Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

https://github.com/suzuki-0000/SKPhotoBrowser

Simple PhotoBrowser/Viewer inspired by facebook, twitter photo browsers written by swift
https://github.com/suzuki-0000/SKPhotoBrowser

photo-browser photos swift

Last synced: about 2 months ago
JSON representation

Simple PhotoBrowser/Viewer inspired by facebook, twitter photo browsers written by swift

Lists

README

        

SKPhotoBrowser


Simple PhotoBrowser/Viewer inspired by facebook, twitter photo browsers written by swift



Swift5





Build Status


Platform


Contributors

## 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 | gif sample |
| ------------- | --------------- | --------------|
| ![sample](Screenshots/example01.gif) | ![sample](Screenshots/example02.gif) | ![sample](Screenshots/example03.gif)

## Requirements
- iOS 9.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:
```
github "suzuki-0000/SKPhotoBrowser"
```

#### Info.plist
If you want to use share image feature, it includes save image into galery, so you should specify a permission into your Info.plist (if you haven't done it yet).
```
NSPhotoLibraryAddUsageDescription
Used to save images into your galery
```

#### Swift Package Manager
Available in Swift Package Manager. Use the repository URL in Xcode

## 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
```swift
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)):



Oreo Chen

πŸ’»

| [
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!