Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions Sources/ImageCarouselViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,30 @@ public class ImageCarouselViewController:UIPageViewController {

private(set) lazy var navItem = UINavigationItem()

public static func create(
sourceView:UIImageView,
imageDataSource: ImageDataSource?,
options:[ImageViewerOption] = [],
initialIndex:Int = 0) -> ImageCarouselViewController {

let pageOptions = [UIPageViewController.OptionsKey.interPageSpacing: 20]

let imageCarousel = ImageCarouselViewController(
transitionStyle: .scroll,
navigationOrientation: .horizontal,
options: pageOptions)

imageCarousel.modalPresentationStyle = .overFullScreen
imageCarousel.modalPresentationCapturesStatusBarAppearance = true

imageCarousel.sourceView = sourceView
imageCarousel.imageDatasource = imageDataSource
imageCarousel.options = options
imageCarousel.initialIndex = initialIndex

return imageCarousel
}

private func addNavBar() {
// Add Navigation Bar
let closeBarButton = UIBarButtonItem(
Expand Down
21 changes: 12 additions & 9 deletions Sources/ImageViewerController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class ImageViewerController:UIViewController, UIGestureRecognizerDelegate {

private var lastLocation:CGPoint = .zero
private var isAnimating:Bool = false
private var maxZoomScale:CGFloat = 1.0

init(sourceView:UIImageView? = nil) {
super.init(nibName: nil, bundle: nil)
Expand Down Expand Up @@ -205,31 +206,33 @@ class ImageViewerController:UIViewController, UIGestureRecognizerDelegate {

func gestureRecognizerShouldBegin(
_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if let panGesture = gestureRecognizer as? UIPanGestureRecognizer {
let velocity = panGesture.velocity(in: scrollView)
return abs(velocity.y) > abs(velocity.x)
}
return false
guard scrollView.zoomScale == scrollView.minimumZoomScale,
let panGesture = gestureRecognizer as? UIPanGestureRecognizer else { return false }

let velocity = panGesture.velocity(in: scrollView)
return abs(velocity.y) > abs(velocity.x)
}
}

// MARK: Adjusting the dimensions
extension ImageViewerController {

func updateMinMaxZoomScaleForSize(_ size: CGSize) {
let widthScale = size.width / imageView.bounds.width
let heightScale = size.height / imageView.bounds.height
let widthScale = (size.width + 1.0) / imageView.bounds.width
let heightScale = (size.height + 1.0) / imageView.bounds.height
let minScale = min(widthScale, heightScale)
let maxScale = max(widthScale, heightScale)

scrollView.minimumZoomScale = minScale
scrollView.zoomScale = minScale
scrollView.maximumZoomScale = max(1, minScale) * 2
maxZoomScale = maxScale
scrollView.maximumZoomScale = maxZoomScale * 1.1
}


func zoomInOrOut(at point:CGPoint) {
let newZoomScale = scrollView.zoomScale == scrollView.minimumZoomScale
? scrollView.maximumZoomScale : scrollView.minimumZoomScale
? maxZoomScale : scrollView.minimumZoomScale
let size = scrollView.bounds.size
let w = size.width / newZoomScale
let h = size.height / newZoomScale
Expand Down
20 changes: 6 additions & 14 deletions Sources/UIImageView_Extensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -110,20 +110,12 @@ extension UIImageView {
private func showImageViewer(_ sender:TapWithDataRecognizer) {
guard let sourceView = sender.view as? UIImageView else { return }

let options = [UIPageViewController.OptionsKey.interPageSpacing: 20]

let imageCarousel = ImageCarouselViewController(
transitionStyle: .scroll,
navigationOrientation: .horizontal,
options: options)

imageCarousel.sourceView = sourceView
imageCarousel.imageDatasource = sender.imageDatasource
imageCarousel.initialIndex = sender.initialIndex
imageCarousel.imageDatasource = sender.imageDatasource
imageCarousel.options = sender.options
imageCarousel.modalPresentationStyle = .overFullScreen
imageCarousel.modalPresentationCapturesStatusBarAppearance = true
let imageCarousel = ImageCarouselViewController.create(
sourceView: sourceView,
imageDataSource: sender.imageDatasource,
options: sender.options,
initialIndex: sender.initialIndex)

vc?.present(imageCarousel, animated: false, completion: nil)
}
}