fix regression related to scrollPos
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,3 +3,4 @@
|
||||
.DS_Store
|
||||
buildServer.json
|
||||
.swiftlint.yml
|
||||
/ImageViewer.xcodeproj/xcuserdata
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user