修改分页问题

This commit is contained in:
shen
2026-05-26 21:08:27 +08:00
parent 0e7d952fe5
commit 83b705b9ae
14 changed files with 227 additions and 50 deletions
@@ -165,6 +165,8 @@ public final class RDEPUBReaderController: UIViewController {
private var currentBrightness: CGFloat
private var didStartInitialLoad = false
private var isRepaginating = false
private var lastTextPaginationPageSize: CGSize?
private var isReconcilingTextPaginationSize = false
private var paginationToken = UUID()
private var paginator: RDEPUBPaginator?
private var searchState: RDEPUBSearchState?
@@ -695,6 +697,7 @@ public final class RDEPUBReaderController: UIViewController {
if publication.readingProfile == .textReflowable {
let renderer = resolvedTextRenderer()
let pageSize = currentTextPageSize()
lastTextPaginationPageSize = pageSize
let layoutConfig = currentTextLayoutConfig(pageSize: pageSize)
let builder = RDEPUBTextBookBuilder(renderer: renderer, cache: textBookCache, layoutConfig: layoutConfig)
let renderStyle = currentTextRenderStyle()
@@ -1258,12 +1261,12 @@ public final class RDEPUBReaderController: UIViewController {
}
private func currentTextPageSize() -> CGSize {
let viewportSize = currentLayoutContext().viewportSize
let insets = configuration.reflowableContentInsets
return CGSize(
width: max(viewportSize.width - insets.left - insets.right, 1),
height: max(viewportSize.height - insets.top - insets.bottom, 1)
)
let pageNum = readerView.currentPage >= 0 ? readerView.currentPage : nil
let resolvedSize = readerView.resolvedSinglePageSize(pageNum: pageNum)
if resolvedSize.width > 0, resolvedSize.height > 0 {
return resolvedSize
}
return currentLayoutContext().viewportSize
}
private func currentTextRenderStyle() -> RDEPUBTextRenderStyle {
@@ -1278,15 +1281,10 @@ public final class RDEPUBReaderController: UIViewController {
}
private func currentTextLayoutConfig(pageSize: CGSize) -> RDEPUBTextLayoutConfig {
let viewportSize = currentLayoutContext().viewportSize
let derivedFrameSize = CGSize(
width: max(viewportSize.width, pageSize.width),
height: max(viewportSize.height, pageSize.height)
)
return RDEPUBTextLayoutConfig(
frameWidth: derivedFrameSize.width,
frameHeight: derivedFrameSize.height,
edgeInsets: .zero,
frameWidth: max(pageSize.width, 1),
frameHeight: max(pageSize.height, 1),
edgeInsets: configuration.reflowableContentInsets,
numberOfColumns: configuration.numberOfColumns,
columnGap: configuration.columnGap,
avoidOrphans: true,
@@ -1834,6 +1832,7 @@ extension RDEPUBReaderController: RDReaderDataSource, RDReaderDelegate {
public func pageNum(readerView: RDReaderView, pageNum: Int) {
updateCurrentSelection(nil)
reconcileTextPaginationSizeIfNeeded(for: pageNum)
let totalPages = pageCountOfReaderView(readerView: readerView)
if totalPages > 0, pageNum == totalPages - 1 {
@@ -1859,6 +1858,36 @@ extension RDEPUBReaderController: RDReaderDataSource, RDReaderDelegate {
_ = isLandscape
pendingPresentationRestoreLocation = currentVisibleLocation() ?? persistenceLocation()
}
private func reconcileTextPaginationSizeIfNeeded(for pageNum: Int) {
guard textBook != nil,
!isRepaginating,
!isReconcilingTextPaginationSize,
pageNum >= 0,
let lastTextPaginationPageSize else {
return
}
let resolvedSize = readerView.resolvedSinglePageSize(pageNum: pageNum)
guard resolvedSize.width > 0,
resolvedSize.height > 0 else {
return
}
let sizeChanged = abs(resolvedSize.width - lastTextPaginationPageSize.width) > 0.5
|| abs(resolvedSize.height - lastTextPaginationPageSize.height) > 0.5
guard sizeChanged else {
return
}
isReconcilingTextPaginationSize = true
DispatchQueue.main.async { [weak self] in
guard let self else { return }
self.isReconcilingTextPaginationSize = false
guard self.textBook != nil, !self.isRepaginating else { return }
self.repaginatePreservingCurrentLocation()
}
}
}
// MARK: - Web EPUB /Web