-
Notifications
You must be signed in to change notification settings - Fork 0
/
ZoomingImageViewController.swift
48 lines (45 loc) · 1.99 KB
/
ZoomingImageViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import UIKit
class ZoomingImageViewController: UIViewController {
private let scrollView = UIScrollView()
private let imageView = UIImageView()
private var image: UIImage { return imageView.image! }
override var prefersStatusBarHidden: Bool { return true }
convenience init(withImage image: UIImage) {
self.init()
view.addSubview(scrollView)
view.backgroundColor = .lightGray
imageView.image = image
imageView.contentMode = .scaleAspectFit
scrollView.addSubview(imageView)
scrollView.delegate = self
scrollView.showsVerticalScrollIndicator = false
scrollView.showsHorizontalScrollIndicator = false
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.frame = view.frame
imageView.frame = scrollView.frame
scrollView.contentSize = imageView.frame.size
scrollView.maximumZoomScale = {
let imageRatio = image.size.height / image.size.width
let viewRatio = scrollView.bounds.size.height / scrollView.bounds.size.width
if imageRatio > viewRatio {
return image.size.height / scrollView.bounds.size.height
} else {
return image.size.width / scrollView.bounds.size.width
}
}()
}
}
extension ZoomingImageViewController: UIScrollViewDelegate {
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imageView
}
func scrollViewDidZoom(_ scrollView: UIScrollView) {
let currentZoomScaleToMax = scrollView.zoomScale / scrollView.maximumZoomScale
let currentImageSize = CGSize(width: image.size.width * currentZoomScaleToMax, height: image.size.height * currentZoomScaleToMax)
let size = CGSize(width: max(scrollView.frame.size.width, currentImageSize.width), height: max(scrollView.frame.size.height, currentImageSize.height))
imageView.frame.size = size
scrollView.contentSize = size
}
}