46 lines
1.8 KiB
Swift
46 lines
1.8 KiB
Swift
import CoreText
|
||
import UIKit
|
||
|
||
// MARK: - NSAttributedString 分页扩展
|
||
|
||
/// 为 NSAttributedString 提供便捷的分页方法,是渲染链路中 CoreText 分页的入口点。
|
||
extension NSAttributedString {
|
||
/// 将富文本按指定页面尺寸分页,返回布局帧列表(每帧对应一页)。
|
||
///
|
||
/// 这是 `RDEPUBTextBookBuilder` 和 `RDPlainTextBookBuilder` 调用的核心分页方法。
|
||
/// - Parameters:
|
||
/// - size: 页面尺寸
|
||
/// - fragmentOffsets: fragment ID → 字符偏移量映射(用于阅读位置恢复)
|
||
/// - config: 布局配置(孤行控制、avoidPageBreakInside 等)
|
||
/// - Returns: 分页后的布局帧列表
|
||
func rd_paginatedFrames(
|
||
size: CGSize,
|
||
fragmentOffsets: [String: Int] = [:],
|
||
config: RDEPUBTextLayoutConfig = .default
|
||
) -> [RDEPUBTextLayoutFrame] {
|
||
let factory = RDEPUBCoreTextPageFrameFactory(attributedString: self, pageSize: size, config: config)
|
||
let counter = RDEPUBChapterPageCounter(factory: factory)
|
||
return counter.layoutFrames(fragmentOffsets: fragmentOffsets)
|
||
}
|
||
|
||
/// 简化版分页:只返回每页的 NSRange 列表(不含语义元数据)
|
||
func ss_pageRanges(size: CGSize) -> [NSRange] {
|
||
rd_paginatedFrames(size: size).map(\.contentRange)
|
||
}
|
||
}
|
||
|
||
// MARK: - UIColor CSS 转换扩展
|
||
|
||
/// 为 UIColor 提供 CSS 颜色字符串转换,用于动态生成暗色模式 CSS。
|
||
extension UIColor {
|
||
/// 将 UIColor 转换为 CSS rgba() 字符串格式
|
||
var ss_cssString: String {
|
||
var red: CGFloat = 0
|
||
var green: CGFloat = 0
|
||
var blue: CGFloat = 0
|
||
var alpha: CGFloat = 0
|
||
getRed(&red, green: &green, blue: &blue, alpha: &alpha)
|
||
return String(format: "rgba(%d, %d, %d, %.3f)", Int(red * 255), Int(green * 255), Int(blue * 255), alpha)
|
||
}
|
||
}
|