Skip to content

Commit 6462936

Browse files
authored
Bugfixes/improve zoom (#82)
* create shortcut for initializing image carousel * make zoom in more natural.
1 parent aa9db4a commit 6462936

File tree

3 files changed

+42
-23
lines changed

3 files changed

+42
-23
lines changed

Sources/ImageCarouselViewController.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,30 @@ public class ImageCarouselViewController:UIPageViewController {
3838

3939
private(set) lazy var navItem = UINavigationItem()
4040

41+
public static func create(
42+
sourceView:UIImageView,
43+
imageDataSource: ImageDataSource?,
44+
options:[ImageViewerOption] = [],
45+
initialIndex:Int = 0) -> ImageCarouselViewController {
46+
47+
let pageOptions = [UIPageViewController.OptionsKey.interPageSpacing: 20]
48+
49+
let imageCarousel = ImageCarouselViewController(
50+
transitionStyle: .scroll,
51+
navigationOrientation: .horizontal,
52+
options: pageOptions)
53+
54+
imageCarousel.modalPresentationStyle = .overFullScreen
55+
imageCarousel.modalPresentationCapturesStatusBarAppearance = true
56+
57+
imageCarousel.sourceView = sourceView
58+
imageCarousel.imageDatasource = imageDataSource
59+
imageCarousel.options = options
60+
imageCarousel.initialIndex = initialIndex
61+
62+
return imageCarousel
63+
}
64+
4165
private func addNavBar() {
4266
// Add Navigation Bar
4367
let closeBarButton = UIBarButtonItem(

Sources/ImageViewerController.swift

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class ImageViewerController:UIViewController, UIGestureRecognizerDelegate {
3636

3737
private var lastLocation:CGPoint = .zero
3838
private var isAnimating:Bool = false
39+
private var maxZoomScale:CGFloat = 1.0
3940

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

206207
func gestureRecognizerShouldBegin(
207208
_ gestureRecognizer: UIGestureRecognizer) -> Bool {
208-
if let panGesture = gestureRecognizer as? UIPanGestureRecognizer {
209-
let velocity = panGesture.velocity(in: scrollView)
210-
return abs(velocity.y) > abs(velocity.x)
211-
}
212-
return false
209+
guard scrollView.zoomScale == scrollView.minimumZoomScale,
210+
let panGesture = gestureRecognizer as? UIPanGestureRecognizer else { return false }
211+
212+
let velocity = panGesture.velocity(in: scrollView)
213+
return abs(velocity.y) > abs(velocity.x)
213214
}
214215
}
215216

216217
// MARK: Adjusting the dimensions
217218
extension ImageViewerController {
218219

219220
func updateMinMaxZoomScaleForSize(_ size: CGSize) {
220-
let widthScale = size.width / imageView.bounds.width
221-
let heightScale = size.height / imageView.bounds.height
221+
let widthScale = (size.width + 1.0) / imageView.bounds.width
222+
let heightScale = (size.height + 1.0) / imageView.bounds.height
222223
let minScale = min(widthScale, heightScale)
224+
let maxScale = max(widthScale, heightScale)
223225

224226
scrollView.minimumZoomScale = minScale
225227
scrollView.zoomScale = minScale
226-
scrollView.maximumZoomScale = max(1, minScale) * 2
228+
maxZoomScale = maxScale
229+
scrollView.maximumZoomScale = maxZoomScale * 1.1
227230
}
228231

229232

230233
func zoomInOrOut(at point:CGPoint) {
231234
let newZoomScale = scrollView.zoomScale == scrollView.minimumZoomScale
232-
? scrollView.maximumZoomScale : scrollView.minimumZoomScale
235+
? maxZoomScale : scrollView.minimumZoomScale
233236
let size = scrollView.bounds.size
234237
let w = size.width / newZoomScale
235238
let h = size.height / newZoomScale

Sources/UIImageView_Extensions.swift

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,12 @@ extension UIImageView {
110110
private func showImageViewer(_ sender:TapWithDataRecognizer) {
111111
guard let sourceView = sender.view as? UIImageView else { return }
112112

113-
let options = [UIPageViewController.OptionsKey.interPageSpacing: 20]
114-
115-
let imageCarousel = ImageCarouselViewController(
116-
transitionStyle: .scroll,
117-
navigationOrientation: .horizontal,
118-
options: options)
119-
120-
imageCarousel.sourceView = sourceView
121-
imageCarousel.imageDatasource = sender.imageDatasource
122-
imageCarousel.initialIndex = sender.initialIndex
123-
imageCarousel.imageDatasource = sender.imageDatasource
124-
imageCarousel.options = sender.options
125-
imageCarousel.modalPresentationStyle = .overFullScreen
126-
imageCarousel.modalPresentationCapturesStatusBarAppearance = true
113+
let imageCarousel = ImageCarouselViewController.create(
114+
sourceView: sourceView,
115+
imageDataSource: sender.imageDatasource,
116+
options: sender.options,
117+
initialIndex: sender.initialIndex)
118+
127119
vc?.present(imageCarousel, animated: false, completion: nil)
128120
}
129121
}

0 commit comments

Comments
 (0)