feat: EPUB阅读器搜索、注释、CFI模块及大书远距跳转优化

- 实现EPUB阅读器搜索功能及选中注释功能
- 优化CFI模块,修复代码审查发现的11个问题
- 实现大书远距目录跳转与后台补全优化方案
- 优化设置面板与章节运行时联动
- 重构及大量改进优化
This commit is contained in:
shenlei
2026-06-22 20:26:34 +08:00
parent f50495ad91
commit c65c190b71
178 changed files with 11380 additions and 6728 deletions
@@ -1,27 +1,18 @@
import UIKit
/// UIPageViewController
///
/// RDReaderView pageCurl
struct RDReaderPagingController {
/// pageCurl
struct PageTransitionRequest: Equatable {
let pageNum: Int
let animated: Bool
}
/// pageCurl
var pendingTransitionRequest: PageTransitionRequest?
///
var isTransitioning: Bool = false
/// UI
var didBuildUI = false
// MARK: - PageViewController
/// spine UIPageViewController
static func createPageViewController(isDualPage: Bool) -> UIPageViewController {
let options: [UIPageViewController.OptionsKey: Any]?
if isDualPage {
@@ -34,16 +25,12 @@ struct RDReaderPagingController {
return pageVC
}
// MARK: -
/// pageCurl
mutating func shouldQueuePageTransition(_ request: PageTransitionRequest, currentDisplayType: RDReaderView.DisplayType) -> Bool {
guard currentDisplayType == .pageCurl, isTransitioning else { return false }
pendingTransitionRequest = request
return true
}
/// pageCurl
mutating func finishPageCurlTransition() -> PageTransitionRequest? {
isTransitioning = false
guard let pending = pendingTransitionRequest else { return nil }
@@ -51,7 +38,6 @@ struct RDReaderPagingController {
return pending
}
///
mutating func resetPendingState() {
isTransitioning = false
pendingTransitionRequest = nil
@@ -1,49 +1,52 @@
//
// RDReaderPreloadController.swift
// ReadViewSDK
//
//
//
import UIKit
///
///
/// 仿
final class RDReaderPreloadController {
/// 1
var radius: Int = 1
private let preloadHostView = UIView()
private var preloadedPageViews: [Int: UIView] = [:]
private var pageCurlCachedViews: [Int: UIView] = [:]
private var cacheSignature: CacheSignature?
///
struct Environment {
let displayType: RDReaderView.DisplayType
let isLandscape: Bool
let pagesPerScreen: Int
let boundsSize: CGSize
let landscapeDualPageEnabled: Bool
let coverPageIndex: Int?
let totalPages: Int
let spreadResolver: RDReaderSpreadResolver
}
private struct CacheSignature: Equatable {
let displayType: RDReaderView.DisplayType
let isLandscape: Bool
let pagesPerScreen: Int
let boundsSize: CGSize
}
/// 宿 frame
func setHostFrame(_ frame: CGRect) {
preloadHostView.frame = frame
}
/// 宿
func ensureHostView(in parentView: UIView) {
guard preloadHostView.superview == nil else { return }
preloadHostView.isHidden = true
@@ -54,12 +57,10 @@ final class RDReaderPreloadController {
parentView.insertSubview(preloadHostView, at: 0)
}
///
func initializeSignature(_ environment: Environment) {
cacheSignature = currentCacheSignature(environment)
}
///
func invalidate(environment: Environment) {
pageCurlCachedViews.values.forEach { $0.removeFromSuperview() }
preloadedPageViews.values.forEach { $0.removeFromSuperview() }
@@ -68,7 +69,6 @@ final class RDReaderPreloadController {
cacheSignature = currentCacheSignature(environment)
}
///
func pageViewForDisplay(
pageNum: Int,
environment: Environment,
@@ -80,14 +80,12 @@ final class RDReaderPreloadController {
return view
}
///
func takePreloadedView(for pageNum: Int) -> UIView? {
let preloaded = preloadedPageViews.removeValue(forKey: pageNum)
preloaded?.removeFromSuperview()
return preloaded
}
///
func prime(
around pageNum: Int,
preferredForward: Bool? = nil,
@@ -1,17 +1,8 @@
//
// RDReaderSpreadResolver.swift
// ReadViewSDK
//
// spread
//
import Foundation
///
///
///
struct RDReaderSpreadResolver {
///
func isFullScreenPage(
_ pageNum: Int,
landscapeDualPageEnabled: Bool,
@@ -22,8 +13,6 @@ struct RDReaderSpreadResolver {
return pageNum == coverIndex
}
/// (, ?)
///
func dualPagePair(
for pageNum: Int,
totalPages: Int,
@@ -45,7 +34,6 @@ struct RDReaderSpreadResolver {
return (left, right)
}
///
func adjacentDualPage(
from pageNum: Int,
totalPages: Int,
@@ -63,7 +51,6 @@ struct RDReaderSpreadResolver {
return dualPagePair(for: prevEnd, totalPages: totalPages, coverPageIndex: coverPageIndex).left
}
/// /
func nextPage(
from currentPage: Int,
totalPages: Int,
@@ -1,20 +1,8 @@
//
// RDReaderTapRegionHandler.swift
// ReadViewSDK
//
//
//
import CoreGraphics
///
///
///
struct RDReaderTapRegionHandler {
///
/// - 1/3 center
/// - 1/3
/// - 1/3 center
func resolveTapEvent(
point: CGPoint,
viewFrame: CGRect,