fix epub reader playback and trial navigation
This commit is contained in:
@@ -12,6 +12,12 @@ protocol RDEpubReaderPageResourceReleasing {
|
||||
func releaseResources()
|
||||
}
|
||||
|
||||
/// 页面进入或离开当前阅读视口时的生命周期通知。
|
||||
/// 持有音视频等持续运行资源的页面应在离开时暂停,在重新进入时恢复。
|
||||
protocol RDEpubReaderPageVisibilityHandling: AnyObject {
|
||||
func readerPageVisibilityDidChange(isVisible: Bool)
|
||||
}
|
||||
|
||||
final class RDEpubReaderPreloadController {
|
||||
|
||||
var radius: Int = 2
|
||||
@@ -121,6 +127,17 @@ final class RDEpubReaderPreloadController {
|
||||
return preloaded
|
||||
}
|
||||
|
||||
func updatePageVisibility(visiblePageNumbers: Set<Int>) {
|
||||
var notifiedViews = Set<ObjectIdentifier>()
|
||||
let cachedViews = pageCurlCachedViews.merging(preloadedPageViews) { current, _ in current }
|
||||
for (pageNumber, view) in cachedViews {
|
||||
let identifier = ObjectIdentifier(view)
|
||||
guard notifiedViews.insert(identifier).inserted else { continue }
|
||||
(view as? RDEpubReaderPageVisibilityHandling)?
|
||||
.readerPageVisibilityDidChange(isVisible: visiblePageNumbers.contains(pageNumber))
|
||||
}
|
||||
}
|
||||
|
||||
func prime(
|
||||
around pageNum: Int,
|
||||
preferredForward: Bool? = nil,
|
||||
@@ -164,7 +181,14 @@ final class RDEpubReaderPreloadController {
|
||||
"cache HIT(pageCurl) page=\(targetPage) view=\(RDEpubReaderTapDebug.describe(cached))"
|
||||
)
|
||||
} else {
|
||||
contentView = contentViewProvider(targetPage, nil) ?? UIView()
|
||||
guard let providedView = contentViewProvider(targetPage, nil) else {
|
||||
// 页面提供者明确禁止预加载时不能塞入空白占位缓存,
|
||||
// 否则真实展示会直接命中白页而不再请求实际内容。
|
||||
preloadedPageViews.removeValue(forKey: targetPage)
|
||||
pageCurlCachedViews.removeValue(forKey: targetPage)
|
||||
continue
|
||||
}
|
||||
contentView = providedView
|
||||
RDEpubReaderTapDebug.log(
|
||||
"PreloadController.prime",
|
||||
"cache MISS page=\(targetPage) created=\(RDEpubReaderTapDebug.describe(contentView))"
|
||||
|
||||
Reference in New Issue
Block a user