Files
ReadViewSDK/Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift
T
2026-05-26 09:19:37 +08:00

136 lines
5.6 KiB
Swift

import UIKit
// MARK: - 文本渲染引擎
/// EPUB 文本渲染引擎枚举
/// 定义了当前支持的文本渲染方式,未来可扩展为多引擎选择
public enum RDEPUBTextRenderingEngine: Equatable {
/// 基于 DTCoreText 的渲染引擎,将 HTML/CSS 转换为 NSAttributedString
case dtCoreText
}
// MARK: - 阅读器配置
/// EPUB 阅读器的完整配置结构体
/// 作为 EPUBUI 层的入口配置,控制阅读器的外观、行为和功能开关
/// 调用方在创建 RDEPUBReaderController 前可自定义此配置
public struct RDEPUBReaderConfiguration: Equatable {
// MARK: 阅读排版参数
/// 正文字号(单位:pt),默认 15
public var fontSize: CGFloat
/// 行距倍数,默认 1.6(即行距为字号的 1.6 倍)
public var lineHeightMultiple: CGFloat
/// 栏数,默认单栏
public var numberOfColumns: Int
/// 栏间距,默认 20pt
public var columnGap: CGFloat
/// 翻页显示模式:.pageCurl(仿真翻页)或 .scroll(滚动阅读)
public var displayType: RDReaderView.DisplayType
/// 横屏时是否启用双页显示,默认开启
public var landscapeDualPageEnabled: Bool
// MARK: UI 功能开关
/// 是否显示目录入口,默认开启
public var showsTableOfContents: Bool
/// 是否允许文本高亮功能,默认开启
public var allowsHighlights: Bool
/// 是否显示设置面板入口,默认开启
public var showsSettingsPanel: Bool
// MARK: 内容内边距
/// 流式排版(reflowable)内容的内边距,上下 40pt、左右 16pt
public var reflowableContentInsets: UIEdgeInsets
/// 固定布局(fixed layout)内容的内边距,默认为零
public var fixedContentInset: UIEdgeInsets
// MARK: 主题与布局
/// 当前阅读主题(浅色/深色/护眼等),默认 .light
public var theme: RDEPUBReaderTheme
/// 固定布局的适配模式:按页适配或按宽度适配
public var fixedLayoutFit: RDEPUBFixedLayoutFit
/// 固定布局的跨页模式:自动/单页/双页
public var fixedLayoutSpreadMode: RDEPUBFixedLayoutSpreadMode
/// 文本渲染引擎,默认使用 DTCoreText
public var textRenderingEngine: RDEPUBTextRenderingEngine
// MARK: 初始化
/// 创建阅读器配置,所有参数均提供合理的默认值
/// - Parameters:
/// - fontSize: 正文字号,默认 15pt
/// - lineHeightMultiple: 行距倍数,默认 1.6
/// - displayType: 翻页模式,默认 .pageCurl
/// - landscapeDualPageEnabled: 横屏双页,默认 true
/// - showsTableOfContents: 显示目录入口,默认 true
/// - allowsHighlights: 允许高亮,默认 true
/// - showsSettingsPanel: 显示设置面板,默认 true
/// - reflowableContentInsets: 流式排版内边距
/// - fixedContentInset: 固定布局内边距
/// - theme: 阅读主题,默认 .light
/// - fixedLayoutFit: 固定布局适配模式
/// - fixedLayoutSpreadMode: 固定布局跨页模式
/// - textRenderingEngine: 文本渲染引擎
public init(
fontSize: CGFloat = 15,
lineHeightMultiple: CGFloat = 1.6,
numberOfColumns: Int = 1,
columnGap: CGFloat = 20,
displayType: RDReaderView.DisplayType = .pageCurl,
landscapeDualPageEnabled: Bool = true,
showsTableOfContents: Bool = true,
allowsHighlights: Bool = true,
showsSettingsPanel: Bool = true,
reflowableContentInsets: UIEdgeInsets = UIEdgeInsets(top: 40, left: 16, bottom: 40, right: 16),
fixedContentInset: UIEdgeInsets = .zero,
theme: RDEPUBReaderTheme = .light,
fixedLayoutFit: RDEPUBFixedLayoutFit = .page,
fixedLayoutSpreadMode: RDEPUBFixedLayoutSpreadMode = .automatic,
textRenderingEngine: RDEPUBTextRenderingEngine = .dtCoreText
) {
self.fontSize = fontSize
self.lineHeightMultiple = lineHeightMultiple
self.numberOfColumns = max(1, numberOfColumns)
self.columnGap = max(0, columnGap)
self.displayType = displayType
self.landscapeDualPageEnabled = landscapeDualPageEnabled
self.showsTableOfContents = showsTableOfContents
self.allowsHighlights = allowsHighlights
self.showsSettingsPanel = showsSettingsPanel
self.reflowableContentInsets = reflowableContentInsets
self.fixedContentInset = fixedContentInset
self.theme = theme
self.fixedLayoutFit = fixedLayoutFit
self.fixedLayoutSpreadMode = fixedLayoutSpreadMode
self.textRenderingEngine = textRenderingEngine
}
/// 默认配置实例,使用所有参数的默认值
public static let `default` = RDEPUBReaderConfiguration()
}
// MARK: - 配置转换
extension RDEPUBReaderConfiguration {
/// 将用户可见的配置转换为底层排版引擎所需的 RDEPUBPreferences
/// - Returns: 排版偏好设置实例,供 Core 层的渲染管道使用
func makePreferences() -> RDEPUBPreferences {
RDEPUBPreferences(
fontSize: fontSize,
lineHeightMultiple: lineHeightMultiple,
reflowableContentInsets: reflowableContentInsets,
fixedContentInset: fixedContentInset,
numberOfColumns: numberOfColumns,
columnGap: columnGap,
themeBackgroundColor: theme.themeBackgroundColorCSS,
themeTextColor: theme.themeTextColorCSS,
fixedBackgroundColor: theme.themeBackgroundColorCSS,
fixedLayoutFit: fixedLayoutFit,
fixedLayoutSpreadMode: fixedLayoutSpreadMode
)
}
}