From 83b705b9ae4ff018dd3ede2dc78551e9324d6a6d Mon Sep 17 00:00:00 2001 From: shen <> Date: Tue, 26 May 2026 21:08:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=86=E9=A1=B5=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/index.md | 2 +- .../ReadViewDemo.xcodeproj/project.pbxproj | 4 ++ .../UserInterfaceState.xcuserstate | Bin 73809 -> 75854 bytes .../RDEPUBDTCoreTextRenderer.swift | 20 +++++- .../RDEPUBTextBookBuilder.swift | 4 +- .../RDEPUBTextBookCache.swift | 2 +- .../RDEPUBTextLayouter.swift | 48 ++++++++++++--- .../RDEPUBTextRenderer.swift | 13 +++- .../RDEPUBTextRendererSupport.swift | 54 +++++++++++++++-- .../EPUBUI/RDEPUBPageLayoutSnapshot.swift | 14 ++++- .../EPUBUI/RDEPUBReaderController.swift | 57 +++++++++++++----- .../EPUBUI/RDEPUBTextContentView.swift | 4 +- .../EPUBUI/RDURLReaderController.swift | 14 ++--- .../ReaderView/RDReaderView.swift | 41 +++++++++++++ 14 files changed, 227 insertions(+), 50 deletions(-) diff --git a/Doc/index.md b/Doc/index.md index 15137c1..c1d4288 100644 --- a/Doc/index.md +++ b/Doc/index.md @@ -21,7 +21,7 @@ | 文档 | 说明 | |------|------| -| [ReflowableEPUB_WXReadRenderer_Design.md](FeatureSolution/ReflowableEPUB_WXReadRenderer_Design.md) | 基于读书反编译的 CoreText 渲染架构,设计 Reflowable EPUB 的增强文本渲染方案(CSS 分层、类型器升级) | +| [ReflowableEPUB_WXReadRenderer_Design.md](FeatureSolution/ReflowableEPUB_WXReadRenderer_Design.md) | 基于读书的 CoreText 渲染架构,设计 Reflowable EPUB 的增强文本渲染方案(CSS 分层、类型器升级) | ## 目录约定 diff --git a/ReadViewDemo/ReadViewDemo.xcodeproj/project.pbxproj b/ReadViewDemo/ReadViewDemo.xcodeproj/project.pbxproj index 0d517cc..1a1aebb 100644 --- a/ReadViewDemo/ReadViewDemo.xcodeproj/project.pbxproj +++ b/ReadViewDemo/ReadViewDemo.xcodeproj/project.pbxproj @@ -185,10 +185,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh\"\n"; diff --git a/ReadViewDemo/ReadViewDemo.xcworkspace/xcuserdata/shen.xcuserdatad/UserInterfaceState.xcuserstate b/ReadViewDemo/ReadViewDemo.xcworkspace/xcuserdata/shen.xcuserdatad/UserInterfaceState.xcuserstate index 447cab9d023acaf462ba5f2b92fd512248908147..add3653dc4ad4fc17ffe38d1e72f9da53fb5574a 100644 GIT binary patch literal 75854 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 DlXFct literal 73809 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 u9O(!k2l)u1Am|wk3Wfzg4PFgi53++df-%9I=bO [AnyHashable: Any] { let style = request.style - let screenBounds = UIScreen.main.bounds.insetBy(dx: 20, dy: 28) + let maxImageSize = resolvedMaxImageSize(for: request) var options: [AnyHashable: Any] = [ NSTextSizeMultiplierDocumentOption: 1.0, DTDefaultFontFamily: style.font.familyName, @@ -124,7 +125,7 @@ public struct RDEPUBDTCoreTextRenderer: RDEPUBTextRenderer { DTDefaultFontSize: style.font.pointSize, DTDefaultLineHeightMultiplier: max((style.font.lineHeight + style.lineSpacing) / max(style.font.lineHeight, 1), 1), DTUseiOS6Attributes: true, - DTMaxImageSize: NSValue(cgSize: screenBounds.size) + DTMaxImageSize: NSValue(cgSize: maxImageSize) ] if let baseURL = request.context.baseURL { @@ -136,5 +137,18 @@ public struct RDEPUBDTCoreTextRenderer: RDEPUBTextRenderer { return options } + + private func resolvedMaxImageSize(for request: RDEPUBTextChapterRenderRequest) -> CGSize { + if let pageSize = request.pageSize { + let layoutConfig = request.layoutConfig ?? .default + let contentRect = layoutConfig.contentRect(fallback: pageSize) + let maxWidth = max(round(contentRect.width), 1) + let maxHeight = max(round(contentRect.height * layoutConfig.imageMaxHeightRatio), 1) + return CGSize(width: maxWidth, height: maxHeight) + } + + let screenBounds = UIScreen.main.bounds.insetBy(dx: 20, dy: 28) + return CGSize(width: max(round(screenBounds.width), 1), height: max(round(screenBounds.height * 0.85), 1)) + } #endif } diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift index 2d9ad0e..f0f7090 100644 --- a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift @@ -293,7 +293,9 @@ public final class RDEPUBTextBookBuilder { baseURL: parser.fileURL(forRelativePath: item.href)?.deletingLastPathComponent(), style: style, resourceResolver: publication.resourceResolver, - contentLanguageCode: publication.metadata.language + contentLanguageCode: publication.metadata.language, + pageSize: pageSize, + layoutConfig: layoutConfig ) // 渲染 HTML → NSAttributedString diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookCache.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookCache.swift index 2d57b6c..3c9d021 100644 --- a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookCache.swift +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookCache.swift @@ -123,7 +123,7 @@ final class ChapterPaginationArchive: NSObject, NSSecureCoding { public final class RDEPUBTextBookCache { /// 缓存模式版本号,变更时旧缓存自动失效 - public var schemaVersion: Int = 1 + public var schemaVersion: Int = 4 /// 串行队列,保证缓存读写的线程安全 private let queue = DispatchQueue(label: "com.rdreader.textbookcache", qos: .utility) diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextLayouter.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextLayouter.swift index dfaaf41..1930713 100644 --- a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextLayouter.swift +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextLayouter.swift @@ -155,27 +155,31 @@ struct RDEPUBTextLayouter { totalLength: attributedString.length, lineRanges: lineRanges ) + let verifiedRange = verifiedDisplayRange(for: adjusted.range) let trailingFragmentID = nearestTrailingFragmentID( - endingAt: adjusted.range.location + adjusted.range.length, + endingAt: verifiedRange.location + verifiedRange.length, fragmentOffsets: fragmentOffsets ) + let diagnostics = verifiedRange == adjusted.range + ? adjusted.diagnostics + : adjusted.diagnostics + ["verified-display-range \(NSStringFromRange(adjusted.range)) -> \(NSStringFromRange(verifiedRange))"] frames.append( RDEPUBTextLayoutFrame( - contentRange: adjusted.range, + contentRange: verifiedRange, breakReason: adjusted.breakReason, - blockRange: adjusted.blockRange, - attachmentRanges: adjusted.attachmentRanges, - attachmentKinds: adjusted.attachmentKinds, - blockKinds: adjusted.blockKinds, - semanticHints: adjusted.semanticHints, - attachmentPlacements: adjusted.attachmentPlacements, + blockRange: blockRange(at: max(verifiedRange.location, verifiedRange.location + verifiedRange.length - 1)), + attachmentRanges: attachmentRanges(in: verifiedRange), + attachmentKinds: attachmentKinds(in: verifiedRange), + blockKinds: blockKinds(in: verifiedRange), + semanticHints: semanticHints(in: verifiedRange), + attachmentPlacements: attachmentPlacements(in: verifiedRange), trailingFragmentID: trailingFragmentID, - diagnostics: adjusted.diagnostics + diagnostics: diagnostics ) ) - let nextLocation = adjusted.range.location + adjusted.range.length + let nextLocation = verifiedRange.location + verifiedRange.length guard nextLocation > location else { location += max(visibleRange.length, 1) continue @@ -185,6 +189,30 @@ struct RDEPUBTextLayouter { return frames } + + private func verifiedDisplayRange(for range: NSRange) -> NSRange { + guard range.length > 0, + !attachmentRanges(in: range).isEmpty else { + return range + } + + let pageContent = attributedString.attributedSubstring(from: range) + guard let layouter = DTCoreTextLayouter(attributedString: pageContent) else { + return range + } + + layouter.shouldCacheLayoutFrames = false + guard let layoutFrame = layouter.layoutFrame(with: dtLayoutRect, range: NSRange(location: 0, length: 0)) else { + return range + } + + let visibleRange = layoutFrame.visibleStringRange() + guard visibleRange.length > 0, visibleRange.length < range.length else { + return range + } + + return NSRange(location: range.location, length: visibleRange.length) + } #endif private static func makeLayoutPath(pageSize: CGSize, config: RDEPUBTextLayoutConfig) -> CGPath { diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRenderer.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRenderer.swift index 683cc0b..33d96c5 100644 --- a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRenderer.swift +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRenderer.swift @@ -286,10 +286,21 @@ public struct RDEPUBTextChapterContext: Equatable { public struct RDEPUBTextChapterRenderRequest { public var context: RDEPUBTextChapterContext public var style: RDEPUBTextRenderStyle + /// 当前章节将被分页到的页面尺寸;用于让附件缩放贴近真实 page size。 + public var pageSize: CGSize? + /// 当前分页布局配置;用于生成与 WXRead 更接近的内容区尺寸。 + public var layoutConfig: RDEPUBTextLayoutConfig? - public init(context: RDEPUBTextChapterContext, style: RDEPUBTextRenderStyle) { + public init( + context: RDEPUBTextChapterContext, + style: RDEPUBTextRenderStyle, + pageSize: CGSize? = nil, + layoutConfig: RDEPUBTextLayoutConfig? = nil + ) { self.context = context self.style = style + self.pageSize = pageSize + self.layoutConfig = layoutConfig } } diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRendererSupport.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRendererSupport.swift index 84e9af7..b086463 100644 --- a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRendererSupport.swift +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRendererSupport.swift @@ -197,7 +197,9 @@ enum RDEPUBTextRendererSupport { baseURL: URL?, style: RDEPUBTextRenderStyle, resourceResolver: RDEPUBResourceResolver?, - contentLanguageCode: String? = nil + contentLanguageCode: String? = nil, + pageSize: CGSize? = nil, + layoutConfig: RDEPUBTextLayoutConfig? = nil ) -> RDEPUBTextChapterRenderRequest { let normalizedHTML = injectPaginationSemanticMarkers(into: normalizeHTML(rawHTML)) let stylesheetHrefReplacements = inlineLinkedStyleSheets( @@ -255,7 +257,12 @@ enum RDEPUBTextRendererSupport { stylesheet: RDEPUBTextStyleSheetPackage(layers: layers), resourceDiagnostics: resourceDiagnostics ) - return RDEPUBTextChapterRenderRequest(context: context, style: style) + return RDEPUBTextChapterRenderRequest( + context: context, + style: style, + pageSize: pageSize, + layoutConfig: layoutConfig + ) } /// HTML 规范化:清理冗余字符(CR、多余换行),规范化附件 HTML 标记 @@ -285,15 +292,20 @@ enum RDEPUBTextRendererSupport { #if canImport(DTCoreText) static func prepareHTMLElementForReaderRendering( _ element: DTHTMLElement, - style: RDEPUBTextRenderStyle + style: RDEPUBTextRenderStyle, + maxImageSize: CGSize? = nil ) { guard let attachment = element.textAttachment else { return } let pointSize = max(element.fontDescriptor.pointSize, style.font.pointSize) - let maxSize = CGSize( + let fallbackSize = CGSize( width: round(UIScreen.main.bounds.insetBy(dx: 20, dy: 28).width), height: round(UIScreen.main.bounds.insetBy(dx: 20, dy: 28).height * 0.85) ) - normalizeAttachmentLayoutForWXRead(attachment, fontPointSize: pointSize, maxImageSize: maxSize) + normalizeAttachmentLayoutForWXRead( + attachment, + fontPointSize: pointSize, + maxImageSize: maxImageSize ?? fallbackSize + ) if isFootnoteAttachment(attachment) { element.displayStyle = .inline } else if isCoverAttachment(attachment) { @@ -390,6 +402,38 @@ enum RDEPUBTextRendererSupport { private static func normalizeAttachmentHTMLMarkers(in html: String) -> String { var normalized = html + if let bodyPicContainerRegex = try? NSRegularExpression( + pattern: #"]*class\s*=\s*["'][^"']*\b(?:qrbodyPic|bodyPic)\b[^"']*["'][^>]*)>([\s\S]*?)"#, + options: [.caseInsensitive] + ) { + normalized = replaceMatches( + using: bodyPicContainerRegex, + in: normalized + ) { tag in + guard let imageTagRegex = try? NSRegularExpression(pattern: #"]*>"#, options: [.caseInsensitive]) else { + return tag + } + + return replaceMatches( + using: imageTagRegex, + in: tag + ) { imageTag in + mergeHTMLAttributes( + into: imageTag, + requiredClass: "bodyPic", + styleFragments: [ + "wr-vertical-center-style:2", + "max-width:100%", + "height:auto", + "display:block", + "margin-left:auto", + "margin-right:auto" + ] + ) + } + } + } + if let footnoteRegex = try? NSRegularExpression( pattern: #"]*class\s*=\s*["'][^"']*\bqqreader-footnote\b[^"']*["'][^>]*)>"#, options: [.caseInsensitive] diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBPageLayoutSnapshot.swift b/Sources/RDReaderView/EPUBUI/RDEPUBPageLayoutSnapshot.swift index 27ec33d..c78808e 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBPageLayoutSnapshot.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBPageLayoutSnapshot.swift @@ -139,9 +139,10 @@ struct RDEPUBPageLayoutSnapshot { var lines: [RDEPUBPageLine] = [] var runs: [RDEPUBPageRun] = [] var attachments: [RDEPUBPageAttachment] = [] + let pageOffset = page.pageStartOffset for dtLine in dtLines { - let lineRange = dtLine.stringRange() + let lineRange = offset(dtLine.stringRange(), by: pageOffset) let line = RDEPUBPageLine( stringRange: lineRange, frame: dtLine.frame, @@ -154,7 +155,7 @@ struct RDEPUBPageLayoutSnapshot { if let glyphRuns = dtLine.glyphRuns as? [DTCoreTextGlyphRun] { for run in glyphRuns { - let runRange = run.stringRange() + let runRange = offset(run.stringRange(), by: pageOffset) let isAttachment = run.attachment != nil runs.append( RDEPUBPageRun( @@ -182,7 +183,7 @@ struct RDEPUBPageLayoutSnapshot { } } - let visibleRange = layoutFrame.visibleStringRange() + let visibleRange = offset(layoutFrame.visibleStringRange(), by: pageOffset) return RDEPUBPageLayoutSnapshot( page: page, @@ -210,5 +211,12 @@ struct RDEPUBPageLayoutSnapshot { : nil return (placement, kind) } + + private static func offset(_ range: NSRange, by offset: Int) -> NSRange { + guard range.location != NSNotFound else { + return range + } + return NSRange(location: range.location + offset, length: range.length) + } #endif } diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift b/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift index 520ddb3..0c8fd85 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift @@ -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 渲染路径) diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift b/Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift index 37829b8..0d8063d 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift @@ -265,7 +265,7 @@ final class RDEPUBTextContentView: UIView { ) #if canImport(DTCoreText) - let displayContent = NSMutableAttributedString(attributedString: page.chapterContent) + let displayContent = NSMutableAttributedString(attributedString: page.content) let fullRange = NSRange(location: 0, length: displayContent.length) displayContent.addAttribute( .foregroundColor, @@ -275,7 +275,7 @@ final class RDEPUBTextContentView: UIView { coreTextContentView.isHidden = false coreTextContentView.backgroundColor = .clear coreTextDisplayContent = displayContent - coreTextDisplayRange = page.contentRange + coreTextDisplayRange = NSRange(location: 0, length: displayContent.length) textView.isHidden = true textView.isUserInteractionEnabled = false textView.attributedText = nil diff --git a/Sources/RDReaderView/EPUBUI/RDURLReaderController.swift b/Sources/RDReaderView/EPUBUI/RDURLReaderController.swift index a9cdac0..536676d 100644 --- a/Sources/RDReaderView/EPUBUI/RDURLReaderController.swift +++ b/Sources/RDReaderView/EPUBUI/RDURLReaderController.swift @@ -123,7 +123,7 @@ public final class RDURLReaderController: UIViewController { layoutConfig: RDEPUBTextLayoutConfig( frameWidth: pageSize.width, frameHeight: pageSize.height, - edgeInsets: .zero, + edgeInsets: epubConfiguration.reflowableContentInsets, numberOfColumns: 1, columnGap: 20, avoidOrphans: true, @@ -179,15 +179,11 @@ public final class RDURLReaderController: UIViewController { print("[ReadViewDemo] automation \(prefix) -> page \(page) href \(href) progression \(progression)") } - /// 计算文本分页的页面尺寸 - /// 基于屏幕尺寸和配置的内边距 + /// 计算文本分页的页面尺寸。 + /// 分页器使用完整 viewport,真实可绘制区域由 layoutConfig.edgeInsets 控制, + /// 以保持与页面展示时的内容几何一致。 private func currentTextPageSize() -> CGSize { - let viewportSize = UIScreen.main.bounds.size - let insets = epubConfiguration.reflowableContentInsets - return CGSize( - width: max(viewportSize.width - insets.left - insets.right, 1), - height: max(viewportSize.height - insets.top - insets.bottom, 1) - ) + UIScreen.main.bounds.size } /// 根据当前配置生成文本渲染样式 diff --git a/Sources/RDReaderView/ReaderView/RDReaderView.swift b/Sources/RDReaderView/ReaderView/RDReaderView.swift index 2ec1b0a..8c155a2 100644 --- a/Sources/RDReaderView/ReaderView/RDReaderView.swift +++ b/Sources/RDReaderView/ReaderView/RDReaderView.swift @@ -1265,6 +1265,47 @@ extension RDReaderView { return cell?.containerView } } + + /// 返回当前阅读模式下单页内容容器的实际尺寸。 + /// 优先使用已经显示出来的内容视图尺寸;若页面尚未装载,则回退到当前模式下的理论单页尺寸。 + public func resolvedSinglePageSize(pageNum: Int? = nil) -> CGSize { + let targetPage = pageNum ?? (currentPage >= 0 ? currentPage : nil) + if let targetPage, + let contentView = pageContentView(pageNum: targetPage), + contentView.bounds.width > 0, + contentView.bounds.height > 0 { + return contentView.bounds.size + } + + if currentDisplayType == .pageCurl { + if let childViewController = pageViewController.viewControllers?.first as? RDReaderPageChildViewController, + childViewController.view.bounds.width > 0, + childViewController.view.bounds.height > 0 { + return childViewController.view.bounds.size + } + if pageViewController.view.bounds.width > 0, pageViewController.view.bounds.height > 0 { + return pageViewController.view.bounds.size + } + return bounds.size + } + + let containerBounds = collectionView.bounds.size == .zero ? bounds.size : collectionView.bounds.size + guard containerBounds.width > 0, containerBounds.height > 0 else { + return bounds.size + } + + switch currentDisplayType { + case .horizontalScroll: + return CGSize( + width: containerBounds.width / CGFloat(max(pagesPerScreen, 1)), + height: containerBounds.height + ) + case .verticalScroll: + return containerBounds + case .pageCurl: + return bounds.size + } + } } private var cellViewKey: Int8 = 0