- Rename source module from RDReaderView to RDEpubReaderView - Move all source files from Sources/RDReaderView/ to Sources/RDEpubReaderView/ - Update podspec: RDReaderView.podspec -> RDEpubReaderView.podspec - Update Podfile, demo project, and CocoaPods config for new pod name - Delete old RDReaderView pod support files from ReadViewDemo/Pods - Add new RDEpubReaderView pod support files - Update documentation (API ref, architecture, UML, conventions, etc.) - Add FixedLayoutRotationTests - Update .gitignore: exclude .DS_Store, manual unpack backups, _ssoft-output
124 lines
5.1 KiB
Swift
124 lines
5.1 KiB
Swift
|
|
import UIKit
|
|
|
|
extension RDEpubReaderView: UIPageViewControllerDataSource, UIPageViewControllerDelegate {
|
|
|
|
private func makeSinglePageChildVC(for pageNum: Int) -> RDEpubReaderPageChildViewController {
|
|
if pageNum == RDEpubReaderView.blankPageNum || pageNum == RDEpubReaderView.blankEndPageNum {
|
|
return RDEpubReaderPageChildViewController(contentView: UIView(), pageNum: pageNum)
|
|
}
|
|
let contentView = pageViewForDisplay(pageNum: pageNum)
|
|
return RDEpubReaderPageChildViewController(contentView: contentView, pageNum: pageNum)
|
|
}
|
|
|
|
private func nextPageNum(after pageNum: Int, isDualPage: Bool) -> Int? {
|
|
let totalPages = numberOfPages()
|
|
|
|
if pageNum == RDEpubReaderView.blankEndPageNum {
|
|
return nil
|
|
}
|
|
|
|
if isDualPage, let coverIndex = coverPageIndex {
|
|
if pageNum == coverIndex {
|
|
return RDEpubReaderView.blankPageNum
|
|
}
|
|
if pageNum == RDEpubReaderView.blankPageNum {
|
|
let firstContent = coverIndex + 1
|
|
return firstContent < totalPages ? firstContent : nil
|
|
}
|
|
}
|
|
|
|
let next = pageNum + 1
|
|
if next < totalPages {
|
|
return next
|
|
}
|
|
|
|
if isDualPage {
|
|
if let coverIndex = coverPageIndex {
|
|
let adjustedIndex = pageNum - (coverIndex + 1)
|
|
if adjustedIndex >= 0 && adjustedIndex % 2 == 0 {
|
|
return RDEpubReaderView.blankEndPageNum
|
|
}
|
|
} else {
|
|
if pageNum % 2 == 0 {
|
|
return RDEpubReaderView.blankEndPageNum
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
private func prevPageNum(before pageNum: Int, isDualPage: Bool) -> Int? {
|
|
if pageNum == RDEpubReaderView.blankEndPageNum {
|
|
let totalPages = numberOfPages()
|
|
return totalPages > 0 ? totalPages - 1 : nil
|
|
}
|
|
if isDualPage, let coverIndex = coverPageIndex {
|
|
if pageNum == RDEpubReaderView.blankPageNum {
|
|
return coverIndex
|
|
}
|
|
if pageNum == coverIndex + 1 {
|
|
return RDEpubReaderView.blankPageNum
|
|
}
|
|
}
|
|
let prev = pageNum - 1
|
|
return prev >= 0 ? prev : nil
|
|
}
|
|
|
|
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
|
|
guard let vc = viewController as? RDEpubReaderPageChildViewController else { return nil }
|
|
let isDualPage = landscapeDualPageEnabled && isLandscape
|
|
let isRTL = pageDirection == .rightToLeft
|
|
|
|
let targetNum = isRTL
|
|
? nextPageNum(after: vc.pageNum, isDualPage: isDualPage)
|
|
: prevPageNum(before: vc.pageNum, isDualPage: isDualPage)
|
|
|
|
guard let num = targetNum else { return nil }
|
|
let targetVC = makeSinglePageChildVC(for: num)
|
|
willPreviousTransitionToViewController = targetVC
|
|
return targetVC
|
|
}
|
|
|
|
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
|
|
guard let vc = viewController as? RDEpubReaderPageChildViewController else { return nil }
|
|
let isDualPage = landscapeDualPageEnabled && isLandscape
|
|
let isRTL = pageDirection == .rightToLeft
|
|
|
|
let targetNum = isRTL
|
|
? prevPageNum(before: vc.pageNum, isDualPage: isDualPage)
|
|
: nextPageNum(after: vc.pageNum, isDualPage: isDualPage)
|
|
|
|
guard let num = targetNum else { return nil }
|
|
let targetVC = makeSinglePageChildVC(for: num)
|
|
willNextTransitionToViewController = targetVC
|
|
return targetVC
|
|
}
|
|
|
|
public func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
|
|
let resolvedPage = (pageViewController.viewControllers?.first as? RDEpubReaderPageChildViewController)?.pageNum ?? -1
|
|
if completed, let firstVC = pageViewController.viewControllers?.first as? RDEpubReaderPageChildViewController {
|
|
let pn = firstVC.pageNum
|
|
if pn != RDEpubReaderView.blankPageNum && pn != RDEpubReaderView.blankEndPageNum {
|
|
currentPage = pn
|
|
primePageCache(around: pn, preferredForward: predictedPageDirection)
|
|
}
|
|
}
|
|
|
|
predictedPageDirection = nil
|
|
finishPageCurlTransition()
|
|
}
|
|
|
|
public func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
|
|
pagingController.isTransitioning = true
|
|
willTransitionToViewController = pendingViewControllers.first
|
|
if let target = pendingViewControllers.first as? RDEpubReaderPageChildViewController,
|
|
target.pageNum != RDEpubReaderView.blankPageNum,
|
|
target.pageNum != RDEpubReaderView.blankEndPageNum {
|
|
predictedPageDirection = target.pageNum >= currentPage
|
|
primePageCache(around: target.pageNum, preferredForward: predictedPageDirection)
|
|
} else {
|
|
}
|
|
}
|
|
}
|