diff --git a/README.md b/README.md index 530e623..32ee5eb 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Version](https://img.shields.io/cocoapods/v/THScrollView-minimap.svg?style=flat)](http://cocoapods.org/pods) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat)](https://github.com/younatics/YNDropDownMenu/blob/master/LICENSE) [![Code Coverage](https://codecov.io/gh/TileImageTeamiOS/THScrollView-minimap/branch/master/graphs/badge.svg)](https://github.com/TileImageTeamiOS/THScrollView-mminimap) -[![Build Status](https://travis-ci.org/TileImageTeamiOS/THScrollView-minimap.svg?branch=master)](https://travis-ci.org/TileImageTeamiOS/THScrollView-minimap) +[![Build Status](https://travis-ci.org/TileImageTeamiOS/THScrollViewMinimap.svg?branch=master)](https://travis-ci.org/TileImageTeamiOS/THScrollView-minimap) [![Platform](https://img.shields.io/cocoapods/p/YNDropDownMenu.svg?style=flat)](http://cocoapods.org/pods) [![Swift 4.0](https://img.shields.io/badge/Swift-4.0-%23FB613C.svg)](https://developer.apple.com/swift/) diff --git a/THScrollView-minimap.podspec b/THScrollViewMinimap.podspec similarity index 100% rename from THScrollView-minimap.podspec rename to THScrollViewMinimap.podspec diff --git a/THScrollViewMinimap.xcodeproj/project.pbxproj b/THScrollViewMinimap.xcodeproj/project.pbxproj index cf9e93a..f2be201 100644 --- a/THScrollViewMinimap.xcodeproj/project.pbxproj +++ b/THScrollViewMinimap.xcodeproj/project.pbxproj @@ -16,8 +16,6 @@ 4E85FD64203FEEBF0051C192 /* THScrollViewMinimapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E85FD63203FEEBF0051C192 /* THScrollViewMinimapTests.swift */; }; 4EBE66B0200B18060091FA38 /* smallBench.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 4EBE66AF200B18060091FA38 /* smallBench.jpg */; }; 4EBE66B2200B183C0091FA38 /* bench.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 4EBE66B1200B183C0091FA38 /* bench.jpg */; }; - 7EF0774D2004BB3F0069E462 /* MyMinimapDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EF0774C2004BB3F0069E462 /* MyMinimapDataSource.swift */; }; - 7EF0774F2004BB740069E462 /* THMinimapDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EF0774E2004BB740069E462 /* THMinimapDataSource.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,8 +42,6 @@ 4E85FD65203FEEBF0051C192 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4EBE66AF200B18060091FA38 /* smallBench.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = smallBench.jpg; sourceTree = ""; }; 4EBE66B1200B183C0091FA38 /* bench.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bench.jpg; sourceTree = ""; }; - 7EF0774C2004BB3F0069E462 /* MyMinimapDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyMinimapDataSource.swift; sourceTree = ""; }; - 7EF0774E2004BB740069E462 /* THMinimapDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = THMinimapDataSource.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -70,7 +66,6 @@ isa = PBXGroup; children = ( 4E78A4651FF7585500F8CB54 /* THMinimapView.swift */, - 7EF0774E2004BB740069E462 /* THMinimapDataSource.swift */, ); path = THMinimap; sourceTree = ""; @@ -100,7 +95,6 @@ 4EBE66AF200B18060091FA38 /* smallBench.jpg */, 4E78A44E1FF7406B00F8CB54 /* AppDelegate.swift */, 4E78A4501FF7406B00F8CB54 /* ViewController.swift */, - 7EF0774C2004BB3F0069E462 /* MyMinimapDataSource.swift */, 4E78A4521FF7406B00F8CB54 /* Main.storyboard */, 4E78A4581FF7406B00F8CB54 /* Assets.xcassets */, 4E78A45A1FF7406B00F8CB54 /* LaunchScreen.storyboard */, @@ -241,8 +235,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7EF0774D2004BB3F0069E462 /* MyMinimapDataSource.swift in Sources */, - 7EF0774F2004BB740069E462 /* THMinimapDataSource.swift in Sources */, 4E78A4511FF7406B00F8CB54 /* ViewController.swift in Sources */, 4E78A4661FF7585500F8CB54 /* THMinimapView.swift in Sources */, 4E78A44F1FF7406B00F8CB54 /* AppDelegate.swift in Sources */, diff --git a/THScrollViewMinimap/Base.lproj/Main.storyboard b/THScrollViewMinimap/Base.lproj/Main.storyboard index 1a9da02..145c34d 100644 --- a/THScrollViewMinimap/Base.lproj/Main.storyboard +++ b/THScrollViewMinimap/Base.lproj/Main.storyboard @@ -13,48 +13,25 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - @@ -63,7 +40,4 @@ - - - diff --git a/THScrollViewMinimap/MyMinimapDataSource.swift b/THScrollViewMinimap/MyMinimapDataSource.swift deleted file mode 100644 index ef37420..0000000 --- a/THScrollViewMinimap/MyMinimapDataSource.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// MyMinimapDataSource.swift -// ScrollViewMinimap -// -// Created by 홍창남 on 2018. 1. 9.. -// Copyright © 2018년 Seong ho Hong. All rights reserved. -// - -import UIKit - -class MyMinimapDataSource: THMinimapDataSource { - - let scrollView: UIScrollView - let thumbnailImage: UIImage - let originImageSize: CGSize? - var borderWidth: CGFloat - var borderColor: UIColor - var downSizeRatio: CGFloat - - init(scrollView: UIScrollView, thumbnailImage: UIImage, originImageSize: CGSize?) { - self.scrollView = scrollView - self.thumbnailImage = thumbnailImage - self.originImageSize = originImageSize - self.borderWidth = 0.0 - self.borderColor = UIColor() - self.downSizeRatio = 0.0 - } -} diff --git a/THScrollViewMinimap/THMinimap/THMinimapDataSource.swift b/THScrollViewMinimap/THMinimap/THMinimapDataSource.swift deleted file mode 100644 index 4819373..0000000 --- a/THScrollViewMinimap/THMinimap/THMinimapDataSource.swift +++ /dev/null @@ -1,97 +0,0 @@ -// -// MinimapDataSource.swift -// ScrollViewMinimap -// -// Created by 홍창남 on 2018. 1. 9.. -// Copyright © 2018년 Seong ho Hong. All rights reserved. -// - -import UIKit - -public protocol THMinimapDataSource { - var scrollView: UIScrollView { get } - var thumbnailImage: UIImage { get } - var originImageSize: CGSize? { get } - var borderWidth: CGFloat { get set } - var borderColor: UIColor { get set } - var downSizeRatio: CGFloat { get set } - - func resizeMinimapView(minimapView: THMinimapView) -} - -extension THMinimapDataSource { - public var minimapImageHeight: CGFloat { - return (thumbnailImage.size.height)/downSizeRatio - } - - public var minimapImageWidth: CGFloat { - return (thumbnailImage.size.width)/downSizeRatio - } - - public var scrollViewVisibleSize: CGRect { - - let zoomScale = scrollView.zoomScale - - let scrollViewX = scrollView.contentOffset.x - let scrollViewY = scrollView.contentOffset.y - let scrollViewHeight = scrollView.bounds.size.height - let scrollViewWidth = scrollView.bounds.size.width - - if let originSize = originImageSize { - let ratio = originSize.height/thumbnailImage.size.height - - return CGRect(x: (scrollViewX/ratio)/zoomScale, y: (scrollViewY/ratio)/zoomScale, - width: (scrollViewWidth/ratio)/zoomScale, height: (scrollViewHeight/ratio)/zoomScale) - } else { - return CGRect(x: scrollViewX/zoomScale, y: scrollViewY/zoomScale, - width: scrollViewWidth/zoomScale, height: scrollViewHeight/zoomScale) - } - } - - public func currentRect(rect: CGRect) -> CGRect { - var x = rect.origin.x - var y = rect.origin.y - var width = rect.size.width - var height = rect.size.height - - if x < 0.0 { - width += x - x = 0.0 - } - - if y < 0.0 { - height += y - y = 0.0 - } - - if self.minimapImageHeight < height { - height = self.minimapImageHeight - } - - if y + height > self.minimapImageHeight { - height = self.minimapImageHeight - y - } - - if self.minimapImageWidth < width { - width = self.minimapImageWidth - } - - if x + width > self.minimapImageWidth { - width = self.minimapImageWidth - x - } - - return CGRect(x: x, y: y, width: width, height: height) - } - - public func resizeMinimapView(minimapView: THMinimapView) { - let rect = self.scrollViewVisibleSize.divideCGRectByDouble(ratio: self.downSizeRatio) - minimapView.focusedBoxView?.frame = currentRect(rect: rect) - } -} - -extension CGRect { - public func divideCGRectByDouble(ratio: CGFloat) -> CGRect { - return CGRect(x: self.origin.x/ratio, y: self.origin.y/ratio, - width: self.width/ratio, height: self.height/ratio) - } -} diff --git a/THScrollViewMinimap/THMinimap/THMinimapView.swift b/THScrollViewMinimap/THMinimap/THMinimapView.swift index f811ac3..fee2cd4 100644 --- a/THScrollViewMinimap/THMinimap/THMinimapView.swift +++ b/THScrollViewMinimap/THMinimap/THMinimapView.swift @@ -7,45 +7,91 @@ // import UIKit +import AVFoundation open class THMinimapView: UIView { + public var focusedBorderWidth: CGFloat = 2.0 + public var focusedBorderColor: CGColor = UIColor.yellow.cgColor + private var focusedBoxView: UIView = UIView() + private var scrollView: UIScrollView = UIScrollView() + private var minimapImageView: UIImageView = UIImageView() + private var scrollImageView: UIImageView = UIImageView() + private var downSizeRatio: CGFloat = 4.0 + private var image = UIImage() + private var minimapImage: UIImage? + convenience init(scrollView: UIScrollView, downSizeRatio: CGFloat, image: UIImage) { + self.init(frame: CGRect.zero) + setUp(scrollView: scrollView, downSizeRatio: downSizeRatio, image: image, minimapImage: nil) + } + convenience init(scrollView: UIScrollView, downSizeRatio: CGFloat, image: UIImage, minimapImage: UIImage) { + self.init(frame: CGRect.zero) + setUp(scrollView: scrollView, downSizeRatio: downSizeRatio, image: image, minimapImage: minimapImage) + } + override init(frame: CGRect) { + super.init(frame: frame) + } + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + private func setUp(scrollView: UIScrollView, downSizeRatio: CGFloat, image: UIImage, minimapImage: UIImage?) { + let width = scrollView.frame.width / downSizeRatio + let height = scrollView.frame.height / downSizeRatio + self.frame = CGRect(x: width * (downSizeRatio - 1), y: height * (downSizeRatio-1), width: width, height: height) - private var dataSource: THMinimapDataSource? - - public var minimapImageView: UIImageView? - public var focusedBoxView: UIView? - - open func set(dataSource: THMinimapDataSource) { - self.dataSource = dataSource - + scrollView.contentInsetAdjustmentBehavior = .never + scrollImageView = UIImageView(frame: CGRect(x: 0, y: 0, + width: scrollView.frame.width, + height: scrollView.frame.height)) minimapImageView = UIImageView(frame: CGRect(x: 0, y: 0, - width: dataSource.minimapImageWidth, - height: dataSource.minimapImageHeight)) - minimapImageView?.image = dataSource.thumbnailImage - minimapImageView?.contentMode = .scaleAspectFit + width: self.frame.width, + height: self.frame.height)) - focusedBoxView = UIView(frame: CGRect(x: 0, y: 0, - width: dataSource.minimapImageWidth, - height: dataSource.minimapImageHeight)) - focusedBoxView?.layer.borderWidth = dataSource.borderWidth - focusedBoxView?.layer.borderColor = dataSource.borderColor.cgColor + focusedBoxView = UIView() - self.addSubview(minimapImageView!) - self.addSubview(focusedBoxView!) + scrollView.addSubview(scrollImageView) + self.addSubview(minimapImageView) + self.addSubview(focusedBoxView) - updateConstraints() + scrollImageView.image = image + if let minimapImage = minimapImage { + minimapImageView.image = minimapImage + focusedBoxView.frame = AVMakeRect(aspectRatio: minimapImage.size, insideRect: minimapImageView.bounds) + } else { + minimapImageView.image = image + focusedBoxView.frame = AVMakeRect(aspectRatio: image.size, insideRect: minimapImageView.bounds) + } + scrollImageView.contentMode = .scaleAspectFit + minimapImageView.contentMode = .scaleAspectFit + focusedBoxView.layer.borderWidth = focusedBorderWidth + focusedBoxView.layer.borderColor = focusedBorderColor } - - open override func updateConstraints() { - super.updateConstraints() - self.removeConstraints(self.constraints) - - if let dataSource = dataSource { - self.heightAnchor.constraint(equalToConstant: dataSource.minimapImageHeight).isActive = true - self.widthAnchor.constraint(equalToConstant: dataSource.minimapImageWidth).isActive = true - - self.trailingAnchor.constraint(equalTo: dataSource.scrollView.trailingAnchor, constant: 50).isActive = true - self.bottomAnchor.constraint(equalTo: dataSource.scrollView.bottomAnchor, constant: 50).isActive = true + public func getScrolledImageView() -> UIImageView { + return scrollImageView + } + public func resize(scrollView: UIScrollView) { + let scrollBox = AVMakeRect(aspectRatio: (scrollImageView.image?.size)!, insideRect: scrollImageView.frame) + let box = AVMakeRect(aspectRatio: (minimapImageView.image?.size)!, insideRect: minimapImageView.frame) + let zoomScale = scrollView.zoomScale + let widthRatio = box.size.width / scrollBox.size.width + let heightRatio = box.size.height / scrollBox.size.height + var newX = (scrollView.contentOffset.x * widthRatio) + var newY = (scrollView.contentOffset.y * heightRatio) + var newWidth = minimapImageView.frame.size.width / zoomScale + var newHeight = minimapImageView.frame.size.height / zoomScale + if box.origin.x > newX { + newWidth -= (box.origin.x - newX) + newX = box.origin.x + } + if box.origin.y > newY { + newHeight -= (box.origin.y - newY) + newY = box.origin.y + } + if (newX + newWidth) > (box.origin.x + box.size.width) { + newWidth = box.size.width - newX + box.origin.x + } + if (newY + newHeight) > (box.origin.y + box.size.height) { + newHeight = box.size.height - newY + box.origin.y } + focusedBoxView.frame = CGRect(x: newX, y: newY, width: newWidth, height: newHeight) } } diff --git a/THScrollViewMinimap/ViewController.swift b/THScrollViewMinimap/ViewController.swift index d26b705..cc742ea 100644 --- a/THScrollViewMinimap/ViewController.swift +++ b/THScrollViewMinimap/ViewController.swift @@ -10,74 +10,29 @@ import UIKit class ViewController: UIViewController { @IBOutlet weak var scrollView: UIScrollView! - @IBOutlet weak var imageView: UIImageView! - @IBOutlet weak var minimapView: THMinimapView! - - var minimapDataSource: THMinimapDataSource! - + var minimapView: THMinimapView? + // images + let minimapImage = UIImage(named: "smallBench.jpg")! + let image = UIImage(named: "bench.jpg")! + func setZoomParameters() { + scrollView.minimumZoomScale = 1 + scrollView.maximumZoomScale = 4.0 + scrollView.zoomScale = 1 + } override func viewDidLoad() { super.viewDidLoad() - - minimap() - - scrollView.contentInsetAdjustmentBehavior = .never - imageView.frame.size = (imageView.image?.size)! scrollView.delegate = self - - setZoomParametersForSize(scrollView.bounds.size) - recenterImage() - } - - func minimap() { - let thumbnailImageURL = Bundle.main.url(forResource: "smallBench", withExtension: "jpg")! - - minimapDataSource = MyMinimapDataSource(scrollView: scrollView, - thumbnailImage: UIImage(contentsOfFile: thumbnailImageURL.path)!, - originImageSize: CGSize(width: 5214, height: 7300)) - minimapDataSource.borderWidth = 2.0 - minimapDataSource.borderColor = UIColor.yellow - minimapDataSource.downSizeRatio = 4.0 - - minimapView.set(dataSource: minimapDataSource) - } - - override func viewWillLayoutSubviews() { - setZoomParametersForSize(scrollView.bounds.size) - recenterImage() - } - - func recenterImage() { - let scrollViewSize = scrollView.bounds.size - let imageSize = imageView.frame.size - - let horizontalSpace = imageSize.width < scrollViewSize.width ? (scrollViewSize.width - imageSize.width) / 2 : 0 - let verticalSpace = imageSize.height < scrollViewSize.height ? (scrollViewSize.height - imageSize.height) / 2 : 0 - - scrollView.contentInset = UIEdgeInsets(top: verticalSpace, - left: horizontalSpace, - bottom: verticalSpace, - right: horizontalSpace) - } - - func setZoomParametersForSize(_ scrollViewSize: CGSize) { - let imageSize = imageView.bounds.size - let widthScale = scrollViewSize.width / imageSize.width - let heightScale = scrollViewSize.height / imageSize.height - let minScale = min(widthScale, heightScale) - - scrollView.minimumZoomScale = minScale - scrollView.maximumZoomScale = 4.0 - scrollView.zoomScale = minScale + setZoomParameters() + // minimap + minimapView = THMinimapView(scrollView: scrollView, downSizeRatio: 4, image: image, minimapImage: minimapImage) + self.view.addSubview(minimapView!) } - } - extension ViewController: UIScrollViewDelegate { public func viewForZooming(in scrollView: UIScrollView) -> UIView? { - return imageView + return minimapView?.getScrolledImageView() } - public func scrollViewDidScroll(_ scrollView: UIScrollView) { - minimapDataSource.resizeMinimapView(minimapView: minimapView) + minimapView?.resize(scrollView: scrollView) } }