Skip to content

Commit d661e7d

Browse files
committed
Merge branch 'master' into improvements/dont-restrict-x
2 parents 02ab1df + 6462936 commit d661e7d

9 files changed

+123
-35
lines changed

Example/Demo/BasicViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class BasicViewController:UIViewController {
55

66
lazy var imageView:UIImageView = {
77
let iv = UIImageView()
8-
iv.image = Data.images[0].resize(targetSize: .thumbnail)
8+
iv.image = Data.images[0]
99

1010
// Setup Image Viewer
1111
iv.setupImageViewer()

Example/Demo/Data.swift

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,22 @@ struct Data {
77
"cat2",
88
"cat3",
99
"cat4",
10-
"cat5"
10+
"cat5",
11+
"cat1",
12+
"cat2",
13+
"cat3",
14+
"cat4",
15+
"cat5",
16+
"cat1",
17+
"cat2",
18+
"cat3",
19+
"cat4",
20+
"cat5",
21+
"cat1",
22+
"cat2",
23+
"cat3",
24+
"cat4",
25+
"cat5",
1126
]
1227

1328
static let images:[UIImage] = Self.imageNames.compactMap { UIImage(named: $0)! }

Example/Demo/ExampleListViewController.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ class ExampleListViewController:UITableViewController {
3838

3939
var items:[ExampleType] = ExampleType.allCases
4040

41+
override func viewDidLoad() {
42+
super.viewDidLoad()
43+
title = "ImageViewer.swift"
44+
}
45+
4146
override func numberOfSections(in tableView: UITableView) -> Int {
4247
return 1
4348
}

Example/Demo/WithURLsViewController.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,18 @@ extension WithURLsViewController:UICollectionViewDataSource {
9292
// Setup Image Viewer with [URL]
9393
cell.imageView.setupImageViewer(
9494
urls: Data.imageUrls,
95-
initialIndex: indexPath.item)
95+
initialIndex: indexPath.item,
96+
options: [
97+
.theme(.dark),
98+
.rightNavItemTitle("Info", delegate: self)
99+
])
96100

97101
return cell
98102
}
99103
}
104+
105+
extension WithURLsViewController:RightNavItemDelegate {
106+
func imageViewer(_ imageViewer: ImageCarouselViewController, didTapRightNavItem index: Int) {
107+
print("TAPPED", index)
108+
}
109+
}

Sources/ImageCarouselViewController.swift

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public protocol ImageDataSource:class {
55
func imageItem(at index:Int) -> ImageItem
66
}
77

8-
class ImageCarouselViewController:UIPageViewController {
8+
public class ImageCarouselViewController:UIPageViewController {
99

1010
weak var imageDatasource:ImageDataSource?
1111
var initialIndex = 0
@@ -19,6 +19,8 @@ class ImageCarouselViewController:UIPageViewController {
1919

2020
var options:[ImageViewerOption] = []
2121

22+
weak var rightNavItemDelegate:RightNavItemDelegate?
23+
2224
private(set) lazy var navBar:UINavigationBar = {
2325
let _navBar = UINavigationBar(frame: .zero)
2426
_navBar.isTranslucent = true
@@ -36,6 +38,30 @@ class ImageCarouselViewController:UIPageViewController {
3638

3739
private(set) lazy var navItem = UINavigationItem()
3840

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+
3965
private func addNavBar() {
4066
// Add Navigation Bar
4167
let closeBarButton = UIBarButtonItem(
@@ -61,15 +87,29 @@ class ImageCarouselViewController:UIPageViewController {
6187

6288
options.forEach {
6389
switch $0 {
64-
case .theme(let theme):
65-
self.theme = theme
66-
case .closeIcon(let icon):
67-
navItem.leftBarButtonItem?.image = icon
90+
case .theme(let theme):
91+
self.theme = theme
92+
case .closeIcon(let icon):
93+
navItem.leftBarButtonItem?.image = icon
94+
case .rightNavItemTitle(let title, let delegate):
95+
navItem.rightBarButtonItem = UIBarButtonItem(
96+
title: title,
97+
style: .plain,
98+
target: self,
99+
action: #selector(diTapRightNavBarItem(_:)))
100+
rightNavItemDelegate = delegate
101+
case .rightNavItemIcon(let icon, let delegate):
102+
navItem.rightBarButtonItem = UIBarButtonItem(
103+
image: icon,
104+
style: .plain,
105+
target: self,
106+
action: #selector(diTapRightNavBarItem(_:)))
107+
rightNavItemDelegate = delegate
68108
}
69109
}
70110
}
71111

72-
override func viewDidLoad() {
112+
override public func viewDidLoad() {
73113
super.viewDidLoad()
74114

75115
addBackgroundView()
@@ -92,24 +132,36 @@ class ImageCarouselViewController:UIPageViewController {
92132
setViewControllers([initialVC], direction: .forward, animated: true, completion: nil)
93133
}
94134

95-
override func viewDidAppear(_ animated: Bool) {
135+
override public func viewDidAppear(_ animated: Bool) {
96136
super.viewDidAppear(animated)
97137
UIView.animate(withDuration: 0.235) {
98138
self.navBar.alpha = 1.0
99139
}
100140
}
101141

102142
@objc
103-
func dismiss(_ sender:UIBarButtonItem?) {
143+
private func dismiss(_ sender:UIBarButtonItem) {
144+
dismissMe(completion: nil)
145+
}
146+
147+
public func dismissMe(completion: (() -> Void)? = nil) {
104148
sourceView.alpha = 1.0
105149
UIView.animate(withDuration: 0.235, animations: {
106150
self.view.alpha = 0.0
107151
}) { _ in
108-
self.dismiss(animated: false, completion: nil)
152+
self.dismiss(animated: false, completion: completion)
109153
}
110154
}
111155

112-
override var preferredStatusBarStyle: UIStatusBarStyle {
156+
@objc
157+
func diTapRightNavBarItem(_ sender:UIBarButtonItem) {
158+
guard let _delegate = rightNavItemDelegate,
159+
let _firstVC = viewControllers?.first as? ImageViewerController
160+
else { return }
161+
_delegate.imageViewer(self, didTapRightNavItem: _firstVC.index)
162+
}
163+
164+
override public var preferredStatusBarStyle: UIStatusBarStyle {
113165
if theme == .dark {
114166
return .lightContent
115167
}
@@ -118,7 +170,7 @@ class ImageCarouselViewController:UIPageViewController {
118170
}
119171

120172
extension ImageCarouselViewController:UIPageViewControllerDataSource {
121-
func pageViewController(
173+
public func pageViewController(
122174
_ pageViewController: UIPageViewController,
123175
viewControllerBefore viewController: UIViewController) -> UIViewController? {
124176

@@ -135,7 +187,7 @@ extension ImageCarouselViewController:UIPageViewControllerDataSource {
135187
delegate: self)
136188
}
137189

138-
func pageViewController(
190+
public func pageViewController(
139191
_ pageViewController: UIPageViewController,
140192
viewControllerAfter viewController: UIViewController) -> UIViewController? {
141193

Sources/ImageViewerController.swift

Lines changed: 13 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)
@@ -116,6 +117,7 @@ class ImageViewerController:UIViewController, UIGestureRecognizerDelegate {
116117

117118
override func viewWillLayoutSubviews() {
118119
super.viewWillLayoutSubviews()
120+
updateConstraintsForSize(view.bounds.size)
119121
updateMinMaxZoomScaleForSize(view.bounds.size)
120122
}
121123

@@ -204,31 +206,33 @@ class ImageViewerController:UIViewController, UIGestureRecognizerDelegate {
204206

205207
func gestureRecognizerShouldBegin(
206208
_ gestureRecognizer: UIGestureRecognizer) -> Bool {
207-
if let panGesture = gestureRecognizer as? UIPanGestureRecognizer {
208-
let velocity = panGesture.velocity(in: scrollView)
209-
return abs(velocity.y) > abs(velocity.x)
210-
}
211-
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)
212214
}
213215
}
214216

215217
// MARK: Adjusting the dimensions
216218
extension ImageViewerController {
217219

218220
func updateMinMaxZoomScaleForSize(_ size: CGSize) {
219-
let widthScale = size.width / imageView.bounds.width
220-
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
221223
let minScale = min(widthScale, heightScale)
224+
let maxScale = max(widthScale, heightScale)
222225

223226
scrollView.minimumZoomScale = minScale
224227
scrollView.zoomScale = minScale
225-
scrollView.maximumZoomScale = max(1, minScale) * 2
228+
maxZoomScale = maxScale
229+
scrollView.maximumZoomScale = maxZoomScale * 1.1
226230
}
227231

228232

229233
func zoomInOrOut(at point:CGPoint) {
230234
let newZoomScale = scrollView.zoomScale == scrollView.minimumZoomScale
231-
? scrollView.maximumZoomScale : scrollView.minimumZoomScale
235+
? maxZoomScale : scrollView.minimumZoomScale
232236
let size = scrollView.bounds.size
233237
let w = size.width / newZoomScale
234238
let h = size.height / newZoomScale

Sources/ImageViewerOption.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ public enum ImageViewerOption {
44

55
case theme(ImageViewerTheme)
66
case closeIcon(UIImage)
7+
case rightNavItemTitle(String, delegate: RightNavItemDelegate?)
8+
case rightNavItemIcon(UIImage, delegate: RightNavItemDelegate?)
79
}

Sources/RightNavItemDelegate.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
public protocol RightNavItemDelegate:class {
3+
func imageViewer(_ imageViewer: ImageCarouselViewController, didTapRightNavItem index:Int)
4+
}

Sources/UIImageView_Extensions.swift

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,13 @@ extension UIImageView {
109109
@objc
110110
private func showImageViewer(_ sender:TapWithDataRecognizer) {
111111
guard let sourceView = sender.view as? UIImageView else { return }
112-
let imageCarousel = ImageCarouselViewController(
113-
transitionStyle: .scroll,
114-
navigationOrientation: .horizontal,
115-
options: nil)
116-
imageCarousel.sourceView = sourceView
117-
imageCarousel.imageDatasource = sender.imageDatasource
118-
imageCarousel.initialIndex = sender.initialIndex
119-
imageCarousel.imageDatasource = sender.imageDatasource
120-
imageCarousel.options = sender.options
121-
imageCarousel.modalPresentationStyle = .overFullScreen
122-
imageCarousel.modalPresentationCapturesStatusBarAppearance = true
112+
113+
let imageCarousel = ImageCarouselViewController.create(
114+
sourceView: sourceView,
115+
imageDataSource: sender.imageDatasource,
116+
options: sender.options,
117+
initialIndex: sender.initialIndex)
118+
123119
vc?.present(imageCarousel, animated: false, completion: nil)
124120
}
125121
}

0 commit comments

Comments
 (0)