136 lines
5.6 KiB
Swift
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
|
||
)
|
||
}
|
||
}
|