修改分页问题
This commit is contained in:
@@ -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 渲染路径)
|
||||
|
||||
Reference in New Issue
Block a user