clean, refactor, update readme.
This commit is contained in:
parent
cb53afd3a2
commit
6d6a93a1ae
42
README.md
42
README.md
|
|
@ -7,12 +7,12 @@ SKPhotoBrowser
|
|||
Simple PhotoBrowser/Viewer inspired by facebook, twitter photo browsers written by swift, based on [IDMPhotoBrowser](https://github.com/ideaismobile/IDMPhotoBrowser), [MWPhotoBrowser](https://github.com/mwaterfall/MWPhotoBrowser).
|
||||
|
||||
## features
|
||||
- Can display one or more images by providing either `UIImage` objects, or string of URL array.
|
||||
- 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
|
||||
- has simple ability to custom photobrowser. (hide/show statusbar, some toolbar for controls, swipe control)
|
||||
- Handling and caching photos from web
|
||||
- Landscape handling.
|
||||
- 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
|
||||
|
||||

|
||||
|
|
@ -42,43 +42,45 @@ github "suzuki-0000/SKPhotoBrowser"
|
|||
Add the code directly into your project.
|
||||
|
||||
##Usage
|
||||
See the code snippet below for an example of how to implement, or example project would be easy to understand.
|
||||
See the code snippet below for an example of how to implement, or see the example project.
|
||||
|
||||
from UIImages:
|
||||
```swift
|
||||
// add SKPhoto Array from UIImage
|
||||
// 1. create SKPhoto Array from UIImage
|
||||
var images = [SKPhoto]()
|
||||
let photo = SKPhoto.photoWithImage(UIImage())// add some UIImage
|
||||
images.append(photo)
|
||||
|
||||
// create PhotoBrowser Instance, and present.
|
||||
// 2. create PhotoBrowser Instance, and present from your viewController.
|
||||
let browser = SKPhotoBrowser(photos: images)
|
||||
browser.initializePageIndex(0)
|
||||
browser.delegate = self
|
||||
presentViewController(browser, animated: true, completion: {})
|
||||
```
|
||||
|
||||
from web URLs:
|
||||
from URLs:
|
||||
```swift
|
||||
// URL pattern snippet
|
||||
// 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)
|
||||
|
||||
// create PhotoBrowser Instance, and present.
|
||||
// 2. create PhotoBrowser Instance, and present.
|
||||
let browser = SKPhotoBrowser(photos: images)
|
||||
browser.initializePageIndex(0)
|
||||
presentViewController(browser, animated: true, completion: {})
|
||||
```
|
||||
|
||||
from local files:
|
||||
```swift
|
||||
// images from local files
|
||||
// 1. create images from local files
|
||||
var images = [SKLocalPhoto]()
|
||||
let photo = SKLocalPhoto.photoWithImageURL("..some_local_path/150x150.png")
|
||||
images.append(photo)
|
||||
|
||||
// create PhotoBrowser Instance, and present.
|
||||
// 2. create PhotoBrowser Instance, and present.
|
||||
let browser = SKPhotoBrowser(photos: images)
|
||||
browser.initializePageIndex(0)
|
||||
presentViewController(browser, animated: true, completion: {})
|
||||
```
|
||||
|
||||
|
|
@ -88,6 +90,7 @@ If you want to use zooming effect from an existing view, use another initializer
|
|||
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, photos: images, animatedFromView: cell)
|
||||
browser.initializePageIndex(indexPath.row)
|
||||
presentViewController(browser, animated: true, completion: {})
|
||||
|
|
@ -97,20 +100,19 @@ func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath i
|
|||
### Custom
|
||||
|
||||
#### Toolbar
|
||||
You can customize the toolbar(back/forward, counter, some action) button.
|
||||
You can customize Toolbar via SKPhotoBrowserOptions.
|
||||
- displayCounterLabel (default is true)
|
||||
- displayBackAndForwardButton (default is true)
|
||||
- displayAction (default is true)
|
||||
|
||||
If you dont want the toolbar at all, you can set displayToolbar = false (default is true)
|
||||
|
||||
```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.displayDeleteButton = true // delete button will be shown
|
||||
let browser = SKPhotoBrowser(originImage: originImage, photos: images, animatedFromView: cell)
|
||||
browser.displayToolbar = false // all tool bar will be hidden
|
||||
browser.displayCounterLabel = false // counter label will be hidden
|
||||
browser.displayBackAndForwardButton = false // back / forward button will be hidden
|
||||
browser.displayAction = false // action button will be hidden
|
||||
browser.displayDeleteButton = true // delete button will be shown
|
||||
```
|
||||
|
||||
#### CustomButton Image
|
||||
|
|
|
|||
|
|
@ -11,62 +11,6 @@ import Foundation
|
|||
// helpers which often used
|
||||
private let bundle = NSBundle(forClass: SKPhotoBrowser.self)
|
||||
|
||||
class SKButtons {
|
||||
|
||||
var customCloseButtonImage: UIImage!
|
||||
var customCloseButtonEdgeInsets: UIEdgeInsets!
|
||||
var customDeleteButtonImage: UIImage!
|
||||
var customDeleteButtonEdgeInsets: UIEdgeInsets!
|
||||
|
||||
var closeButton: SKCloseButton!
|
||||
var deleteButton: SKDeleteButton!
|
||||
|
||||
private weak var browser: SKPhotoBrowser?
|
||||
|
||||
init(browser: SKPhotoBrowser) {
|
||||
self.browser = browser
|
||||
|
||||
setSettingCloseButton()
|
||||
setSettingDeleteButton()
|
||||
}
|
||||
|
||||
func setup() {}
|
||||
|
||||
private func setSettingCloseButton() {
|
||||
guard let browser = browser else { return }
|
||||
|
||||
closeButton = SKCloseButton(frame: browser.view.frame)
|
||||
closeButton.addTarget(browser, action: #selector(browser.closeButtonPressed(_:)), forControlEvents: .TouchUpInside)
|
||||
closeButton.hidden = !SKPhotoBrowserOptions.displayCloseButton
|
||||
browser.view.addSubview(closeButton)
|
||||
|
||||
// If another developer has not set their values
|
||||
if customCloseButtonImage != nil {
|
||||
closeButton.setImage(customCloseButtonImage, forState: .Normal)
|
||||
}
|
||||
if customCloseButtonEdgeInsets != nil {
|
||||
closeButton.imageEdgeInsets = customCloseButtonEdgeInsets
|
||||
}
|
||||
}
|
||||
|
||||
private func setSettingDeleteButton() {
|
||||
guard let browser = browser else { return }
|
||||
|
||||
deleteButton = SKDeleteButton(frame: browser.view.frame)
|
||||
deleteButton.addTarget(browser, action: #selector(browser.deleteButtonPressed(_:)), forControlEvents: .TouchUpInside)
|
||||
deleteButton.hidden = !SKPhotoBrowserOptions.displayDeleteButton
|
||||
browser.view.addSubview(deleteButton)
|
||||
|
||||
// If another developer has not set their values
|
||||
if customDeleteButtonImage != nil {
|
||||
deleteButton.setImage(customCloseButtonImage, forState: .Normal)
|
||||
}
|
||||
if customDeleteButtonEdgeInsets != nil {
|
||||
deleteButton.imageEdgeInsets = customCloseButtonEdgeInsets
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SKButton: UIButton {
|
||||
var showFrame: CGRect!
|
||||
var hideFrame: CGRect!
|
||||
|
|
@ -82,6 +26,7 @@ class SKButton: UIButton {
|
|||
func setup(imageName: String) {
|
||||
backgroundColor = .clearColor()
|
||||
imageEdgeInsets = insets
|
||||
// clipsToBounds = true
|
||||
translatesAutoresizingMaskIntoConstraints = true
|
||||
autoresizingMask = [.FlexibleBottomMargin, .FlexibleLeftMargin, .FlexibleRightMargin, .FlexibleTopMargin]
|
||||
|
||||
|
|
@ -126,9 +71,5 @@ class SKDeleteButton: SKButton {
|
|||
}
|
||||
|
||||
override func updateFrame() {
|
||||
showFrame = CGRect(x: SKMesurement.screenWidth - size.width, y: buttonTopOffset,
|
||||
width: size.width, height: size.height)
|
||||
hideFrame = CGRect(x: SKMesurement.screenWidth - size.width, y: -20,
|
||||
width: size.width, height: size.height)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,8 +15,9 @@ public class SKPhotoBrowser: UIViewController {
|
|||
|
||||
let pageIndexTagOffset: Int = 1000
|
||||
|
||||
lazy var buttons: SKButtons = SKButtons(browser: self)
|
||||
lazy var toolbar: SKToolbar = SKToolbar(frame: self.frameForToolbarAtOrientation(), browser: self)
|
||||
private var closeButton: SKCloseButton!
|
||||
private var deleteButton: SKDeleteButton!
|
||||
private var toolbar: SKToolbar!
|
||||
|
||||
// actions
|
||||
private var activityViewController: UIActivityViewController!
|
||||
|
|
@ -27,13 +28,6 @@ public class SKPhotoBrowser: UIViewController {
|
|||
private var pagingScrollView: SKPagingScrollView!
|
||||
var backgroundView: UIView!
|
||||
|
||||
private var closeButton: SKCloseButton {
|
||||
return buttons.closeButton
|
||||
}
|
||||
private var deleteButton: SKDeleteButton {
|
||||
return buttons.deleteButton
|
||||
}
|
||||
|
||||
var initialPageIndex: Int = 0
|
||||
var currentPageIndex: Int = 0
|
||||
|
||||
|
|
@ -117,13 +111,13 @@ public class SKPhotoBrowser: UIViewController {
|
|||
override public func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
setupAppearance()
|
||||
|
||||
toolbar.setup()
|
||||
buttons.setup()
|
||||
configureAppearance()
|
||||
configureButtons()
|
||||
configureToolbar()
|
||||
|
||||
animator.willPresent(self)
|
||||
}
|
||||
|
||||
|
||||
override public func viewWillAppear(animated: Bool) {
|
||||
super.viewWillAppear(true)
|
||||
|
|
@ -256,7 +250,7 @@ public class SKPhotoBrowser: UIViewController {
|
|||
return CGPoint(x: newOffset, y: 0)
|
||||
}
|
||||
|
||||
private func setupAppearance() {
|
||||
private func configureAppearance() {
|
||||
view.backgroundColor = .blackColor()
|
||||
view.clipsToBounds = true
|
||||
view.opaque = false
|
||||
|
|
@ -278,6 +272,24 @@ public class SKPhotoBrowser: UIViewController {
|
|||
}
|
||||
}
|
||||
|
||||
private func configureButtons() {
|
||||
closeButton = SKCloseButton(frame: .zero)
|
||||
closeButton.addTarget(self, action: #selector(closeButtonPressed(_:)), forControlEvents: .TouchUpInside)
|
||||
closeButton.hidden = !SKPhotoBrowserOptions.displayCloseButton
|
||||
view.addSubview(closeButton)
|
||||
|
||||
deleteButton = SKDeleteButton(frame: .zero)
|
||||
deleteButton.addTarget(self, action: #selector(deleteButtonPressed(_:)), forControlEvents: .TouchUpInside)
|
||||
deleteButton.hidden = !SKPhotoBrowserOptions.displayDeleteButton
|
||||
view.addSubview(deleteButton)
|
||||
}
|
||||
|
||||
private func configureToolbar() {
|
||||
toolbar = SKToolbar(frame: frameForToolbarAtOrientation(), browser: self)
|
||||
view.addSubview(toolbar)
|
||||
}
|
||||
|
||||
|
||||
private func deleteImage() {
|
||||
defer {
|
||||
reloadData()
|
||||
|
|
@ -502,7 +514,20 @@ public class SKPhotoBrowser: UIViewController {
|
|||
}
|
||||
}
|
||||
|
||||
// MARK: - Public Function For Customizing Buttons
|
||||
|
||||
public extension SKPhotoBrowser {
|
||||
func updateCloseButton(image: UIImage, showFrame: CGRect, hideFrame: CGRect) {
|
||||
// closeButton.setImage(image, forState: .Normal)
|
||||
// buttons.closeButton.frame = showFrame
|
||||
// buttons.closeButton.showFrame = showFrame
|
||||
// buttons.closeButton.hideFrame = hideFrame
|
||||
// buttons.closeButton.layoutIfNeeded()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Public Function For Toolbar Control
|
||||
|
||||
public extension SKPhotoBrowser {
|
||||
func cancelControlHiding() {
|
||||
if controlVisibilityTimer != nil {
|
||||
|
|
|
|||
|
|
@ -32,14 +32,42 @@ class SKToolbar: UIToolbar {
|
|||
self.init(frame: frame)
|
||||
self.browser = browser
|
||||
|
||||
setupToolbar()
|
||||
setupApperance()
|
||||
setupPreviousButton()
|
||||
setupNextButton()
|
||||
setupCounterLabel()
|
||||
setupActionButton()
|
||||
setupToolbar()
|
||||
}
|
||||
|
||||
func setup() {
|
||||
func updateToolbar(currentPageIndex: Int) {
|
||||
guard let browser = browser else { return }
|
||||
|
||||
if browser.numberOfPhotos > 1 {
|
||||
toolCounterLabel.text = "\(currentPageIndex + 1) / \(browser.numberOfPhotos)"
|
||||
} else {
|
||||
toolCounterLabel.text = nil
|
||||
}
|
||||
|
||||
toolPreviousButton.enabled = (currentPageIndex > 0)
|
||||
toolNextButton.enabled = (currentPageIndex < browser.numberOfPhotos - 1)
|
||||
}
|
||||
}
|
||||
|
||||
private extension SKToolbar {
|
||||
func setupApperance() {
|
||||
backgroundColor = .clearColor()
|
||||
clipsToBounds = true
|
||||
translucent = true
|
||||
setBackgroundImage(UIImage(), forToolbarPosition: .Any, barMetrics: .Default)
|
||||
|
||||
// toolbar
|
||||
if !SKPhotoBrowserOptions.displayToolbar {
|
||||
hidden = true
|
||||
}
|
||||
}
|
||||
|
||||
func setupToolbar() {
|
||||
guard let browser = browser else { return }
|
||||
|
||||
let flexSpace = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: self, action: nil)
|
||||
|
|
@ -65,36 +93,6 @@ class SKToolbar: UIToolbar {
|
|||
setItems(items, animated: false)
|
||||
}
|
||||
|
||||
func updateToolbar(currentPageIndex: Int) {
|
||||
guard let browser = browser else { return }
|
||||
|
||||
if browser.numberOfPhotos > 1 {
|
||||
toolCounterLabel.text = "\(currentPageIndex + 1) / \(browser.numberOfPhotos)"
|
||||
} else {
|
||||
toolCounterLabel.text = nil
|
||||
}
|
||||
|
||||
toolPreviousButton.enabled = (currentPageIndex > 0)
|
||||
toolNextButton.enabled = (currentPageIndex < browser.numberOfPhotos - 1)
|
||||
}
|
||||
}
|
||||
|
||||
private extension SKToolbar {
|
||||
func setupToolbar() {
|
||||
guard let browser = browser else { return }
|
||||
|
||||
backgroundColor = .clearColor()
|
||||
clipsToBounds = true
|
||||
translucent = true
|
||||
setBackgroundImage(UIImage(), forToolbarPosition: .Any, barMetrics: .Default)
|
||||
browser.view.addSubview(self)
|
||||
|
||||
// toolbar
|
||||
if !SKPhotoBrowserOptions.displayToolbar {
|
||||
hidden = true
|
||||
}
|
||||
}
|
||||
|
||||
func setupPreviousButton() {
|
||||
let previousBtn = SKPreviousButton(frame: frame)
|
||||
previousBtn.addTarget(browser, action: #selector(SKPhotoBrowser.gotoPreviousPage), forControlEvents: .TouchUpInside)
|
||||
|
|
|
|||
|
|
@ -63,12 +63,14 @@ extension FromLocalViewController {
|
|||
return
|
||||
}
|
||||
|
||||
SKPhotoBrowserOptions.displayDeleteButton = true
|
||||
// SKPhotoBrowserOptions.displayToolbar = false
|
||||
|
||||
let browser = SKPhotoBrowser(originImage: originImage, photos: images, animatedFromView: cell)
|
||||
// let browser = SKPhotoBrowser(photos: images)
|
||||
browser.initializePageIndex(indexPath.row)
|
||||
browser.delegate = self
|
||||
browser.updateCloseButton(UIImage(named: "image1.jpg")!,
|
||||
showFrame: CGRect(x: 10, y: 10, width: 30, height: 30),
|
||||
hideFrame: CGRect(x: 10, y: -10, width: 30, height: 30))
|
||||
|
||||
presentViewController(browser, animated: true, completion: {})
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue