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,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,