fix(reader): stabilize pagination display and page curl reuse

This commit is contained in:
shen
2026-05-26 21:37:39 +08:00
parent 83b705b9ae
commit 736902b489
4 changed files with 104 additions and 23 deletions
@@ -624,19 +624,31 @@ public class RDReaderView: UIView {
///
///
private func pageViewForDisplay(pageNum: Int) -> UIView {
if let cached = pageCurlCachedViews[pageNum] {
return cached
}
if let preloaded = preloadedPageViews.removeValue(forKey: pageNum) {
preloaded.removeFromSuperview()
pageCurlCachedViews[pageNum] = preloaded
return preloaded
}
let view = dataSource?.pageContentView(readerView: self, pageNum: pageNum, containerView: nil) ?? UIView()
let reusableView = detachedReusablePageView(for: pageNum)
let view = dataSource?.pageContentView(readerView: self, pageNum: pageNum, containerView: reusableView)
?? reusableView
?? UIView()
pageCurlCachedViews[pageNum] = view
return view
}
/// page view
/// view pageCurl UIView
/// child controller
private func detachedReusablePageView(for pageNum: Int) -> UIView? {
if let preloaded = preloadedPageViews.removeValue(forKey: pageNum) {
preloaded.removeFromSuperview()
return preloaded
}
guard let cached = pageCurlCachedViews[pageNum], cached.superview == nil else {
return nil
}
pageCurlCachedViews.removeValue(forKey: pageNum)
return cached
}
///
///
private func trimCachedPageViews(keeping pageNumbers: Set<Int>) {
@@ -705,7 +717,7 @@ public class RDReaderView: UIView {
preloadHostView.frame = bounds
for targetPage in targets {
let existing = preloadedPageViews[targetPage] ?? pageCurlCachedViews.removeValue(forKey: targetPage)
let existing = detachedReusablePageView(for: targetPage)
let contentView = dataSource?.pageContentView(readerView: self, pageNum: targetPage, containerView: existing) ?? existing ?? UIView()
preloadedPageViews[targetPage] = contentView
if contentView.superview !== preloadHostView {