diff --git a/README.md b/README.md index aa2dd5c..59ed370 100644 --- a/README.md +++ b/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 ![sample](Screenshots/example02.gif) @@ -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 diff --git a/SKPhotoBrowser/SKButtons.swift b/SKPhotoBrowser/SKButtons.swift index 9ca74c3..20834f4 100644 --- a/SKPhotoBrowser/SKButtons.swift +++ b/SKPhotoBrowser/SKButtons.swift @@ -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) } } diff --git a/SKPhotoBrowser/SKPhotoBrowser.swift b/SKPhotoBrowser/SKPhotoBrowser.swift index d874d20..22b96c0 100644 --- a/SKPhotoBrowser/SKPhotoBrowser.swift +++ b/SKPhotoBrowser/SKPhotoBrowser.swift @@ -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 { diff --git a/SKPhotoBrowser/SKToolbar.swift b/SKPhotoBrowser/SKToolbar.swift index decd30f..8345cb4 100644 --- a/SKPhotoBrowser/SKToolbar.swift +++ b/SKPhotoBrowser/SKToolbar.swift @@ -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) diff --git a/SKPhotoBrowserExample/SKPhotoBrowserExample/FromLocalViewController.swift b/SKPhotoBrowserExample/SKPhotoBrowserExample/FromLocalViewController.swift index ab3b6b7..2c8152d 100644 --- a/SKPhotoBrowserExample/SKPhotoBrowserExample/FromLocalViewController.swift +++ b/SKPhotoBrowserExample/SKPhotoBrowserExample/FromLocalViewController.swift @@ -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: {}) }