diff --git a/.gitignore b/.gitignore index c9822f3..6e8a68a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ .DS_Store buildServer.json .swiftlint.yml +/ImageViewer.xcodeproj/xcuserdata diff --git a/ImageViewer/ViewController.swift b/ImageViewer/ViewController.swift index 1ed2752..cd58b33 100644 --- a/ImageViewer/ViewController.swift +++ b/ImageViewer/ViewController.swift @@ -1,7 +1,9 @@ -//TODO: Implement support for bonus chapters -//TODO: Implement Anilist support? +//TODO: Support for bonus chapters +//TODO: Anilist support? //TODO: Properly avoid swallowing of input from UICollectionView used for scrolling //TODO: Convert between state for normal and scrolling page turn +//TODO: Support reading with scrolling and landscape mode +//FIXME: Update comicCollectionView when switching between landscape and portrait mode import UIKit @@ -82,6 +84,8 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { var currentChapter: Int! = nil var currentPath: URL! + var changedOrientation = false + var leftTap: UITapGestureRecognizer! var rightTap: UITapGestureRecognizer! var topTap: UITapGestureRecognizer! @@ -247,13 +251,18 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { func saveLocalState() { let color = readerView.backgroundColor ?? .black + let screenSize = UIScreen.main.bounds.size + var scrollOffset = scrollingCollectionView.contentOffset + if screenSize.width > screenSize.height { + scrollOffset.y *= (screenSize.height / screenSize.width) + } let progress: ReadProgress = switch self.mode { case .leftToRight: - ReadProgress.leftToRight(chapter: self.currentChapter, page: self.currentPage) + ReadProgress.leftToRight(chapter: currentChapter, page: currentPage) case .rightToLeft: - ReadProgress.rightToLeft(chapter: self.currentChapter, page: self.currentPage) - case .scroll: ReadProgress.scroll(scrollingCollectionView.contentOffset) + ReadProgress.rightToLeft(chapter: currentChapter, page: currentPage) + case .scroll: ReadProgress.scroll(scrollOffset) } queue.async { do { @@ -278,27 +287,27 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { let local = try JSONDecoder().decode(LocalState.self, from: json) switch local.progress { case .leftToRight(let chapter, let page): - self.currentChapter = chapter - self.currentPage = page - self.mode = .leftToRight + currentChapter = chapter + currentPage = page + mode = .leftToRight case .rightToLeft(let chapter, let page): - self.currentChapter = chapter - self.currentPage = page - self.mode = .rightToLeft + currentChapter = chapter + currentPage = page + mode = .rightToLeft case .scroll(let point): - if self.scrollPos == nil { - self.scrollPos = point - let centerPoint = CGPoint( - x: scrollingCollectionView.bounds.midX - + scrollingCollectionView.contentOffset.x, - y: scrollingCollectionView.bounds.midY - + scrollingCollectionView.contentOffset.y) - - if let indexPath = scrollingCollectionView.indexPathForItem(at: centerPoint) { + if scrollPos == nil { + scrollPos = point + let screenSize = UIScreen.main.bounds.size + var scrollOffset = point + if screenSize.width > screenSize.height { + scrollOffset.y *= (screenSize.width / screenSize.height) + } + if let indexPath = scrollingCollectionView.indexPathForItem(at: scrollOffset) { let (chapter, page) = chapterAndPages[indexPath.item] currentChapter = chapter currentPage = page } + } self.mode = .scroll } @@ -338,11 +347,25 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() - if scrollingCollectionView.isHidden == false && mode == .scroll - && !hasSetContentOffset + if scrollingCollectionView.isHidden == true || mode != .scroll + || scrollingCollectionView.contentSize == .zero { - scrollingCollectionView.setContentOffset(scrollPos, animated: false) + return + } + if !hasSetContentOffset && scrollPos != nil { + let screenSize = UIScreen.main.bounds.size + var offset = scrollPos! + if screenSize.width > screenSize.height { + offset.y *= (screenSize.width / screenSize.height) + } + scrollingCollectionView.setContentOffset(offset, animated: false) hasSetContentOffset = true + } else if changedOrientation { + changedOrientation = false + let screenSize = UIScreen.main.bounds.size + var offset = scrollingCollectionView.contentOffset + offset.y *= (screenSize.width / screenSize.height) + scrollingCollectionView.setContentOffset(offset, animated: false) } } @@ -972,7 +995,10 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { } func setImages(path: URL, metadata: Metadata) { - let scaling = UIView.ContentMode.scaleAspectFit + let scaling: UIView.ContentMode = + if mode == .scroll { + .scaleAspectFill + } else { .scaleAspectFit } var directories: [URL] = [] if currentPage != nil && currentChapter != nil { var vol = Int(metadata.chapters[currentChapter - 1].volume) @@ -1051,16 +1077,20 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator ) { super.viewWillTransition(to: size, with: coordinator) - - self.imageLoader.loadImage( - at: self.getImagePath( - chapter: self.currentChapter, - volume: Int(self.metadata.chapters[self.currentChapter - 1].volume), - page: self.currentPage, - path: self.currentPath), - scaling: .scaleAspectFit - ) { image in - self.imageView.image = image + if mode != .scroll { + self.imageLoader.loadImage( + at: self.getImagePath( + chapter: self.currentChapter, + volume: Int(self.metadata.chapters[self.currentChapter - 1].volume), + page: self.currentPage, + path: self.currentPath), + scaling: .scaleAspectFit + ) { image in + self.imageView.image = image + } + } else { + scrollingCollectionView.reloadData() + changedOrientation = true } } } @@ -1328,7 +1358,9 @@ class ImageLoader { let vScaleImage = resizeImage(image, to: vScaledSize) guard let cost = imageByteSize(vScaleImage) else { return } self.cache.setObject(vScaleImage, forKey: path.path as NSString, cost: cost) - image = vScaleImage + if rotation == .vertical { + image = vScaleImage + } } if completion == nil || rotation == .horizontal { @@ -1340,7 +1372,9 @@ class ImageLoader { let hScaleImage = resizeImage(image, to: hScaledSize) guard let cost = imageByteSize(hScaleImage) else { return } self.horCache.setObject(hScaleImage, forKey: path.path as NSString, cost: cost) - image = hScaleImage + if rotation == .horizontal { + image = hScaleImage + } } DispatchQueue.main.async {