199 lines
5.9 KiB
Swift
199 lines
5.9 KiB
Swift
//
|
|
// RDReaderCommon.swift
|
|
// RDReaderDemo
|
|
//
|
|
// Created by yangsq on 2021/8/11.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
import CoreText
|
|
|
|
struct RDReaderCommon {
|
|
static var safeAreaInsets: UIEdgeInsets = {
|
|
guard #available(iOS 11.0, *) else {
|
|
return .zero
|
|
}
|
|
return UIApplication.shared.windows[0].safeAreaInsets
|
|
}()
|
|
|
|
}
|
|
|
|
extension RDReaderCommon {
|
|
enum SpaceType: Int, RDReaderObserverType {
|
|
case min = 0
|
|
case meduim
|
|
case max
|
|
var mulitiple: CGFloat {
|
|
switch self {
|
|
case .min: return 1.6
|
|
case .meduim: return 2.0
|
|
case .max: return 3.0
|
|
}
|
|
}
|
|
|
|
var image: UIImage? {
|
|
switch self {
|
|
case .min:
|
|
return UIImage.rdToolbarImage(named: "read_edit_textSpace_3", fallbackSystemName: "text.justify.leading")
|
|
case .meduim:
|
|
return UIImage.rdToolbarImage(named: "read_edit_textSpace_2", fallbackSystemName: "text.justify")
|
|
case .max:
|
|
return UIImage.rdToolbarImage(named: "read_edit_textSpace_1", fallbackSystemName: "text.justify.right")
|
|
}
|
|
}
|
|
|
|
var cachesValue: Int {
|
|
return rawValue
|
|
}
|
|
var value: CGFloat {
|
|
return mulitiple
|
|
}
|
|
func transform(value: Any?) -> RDReaderCommon.SpaceType {
|
|
guard let value = value as? Int else {
|
|
return self
|
|
}
|
|
return RDReaderCommon.SpaceType(rawValue: value) ?? self
|
|
}
|
|
}
|
|
}
|
|
|
|
extension RDReaderCommon {
|
|
enum PageCurlType: Int, RDReaderObserverType {
|
|
case pageCurl
|
|
case horizontalScroll
|
|
case verticalScroll
|
|
case horizontalCoverScroll
|
|
|
|
var title: String {
|
|
switch self {
|
|
case .pageCurl:
|
|
return "仿真"
|
|
case .horizontalScroll:
|
|
return "左右滑动"
|
|
case .verticalScroll:
|
|
return "上下滚动"
|
|
case .horizontalCoverScroll:
|
|
return "左右覆盖"
|
|
}
|
|
}
|
|
|
|
var cachesValue: Int {
|
|
return rawValue
|
|
}
|
|
var value: RDReaderView.DisplayType {
|
|
switch self {
|
|
case .pageCurl:
|
|
return RDReaderView.DisplayType.pageCurl
|
|
case .horizontalScroll:
|
|
return RDReaderView.DisplayType.horizontalScroll
|
|
case .verticalScroll:
|
|
return RDReaderView.DisplayType.verticalScroll
|
|
case .horizontalCoverScroll:
|
|
return RDReaderView.DisplayType.horizontalScroll
|
|
}
|
|
}
|
|
|
|
func transform(value: Any?) -> RDReaderCommon.PageCurlType {
|
|
guard let value = value as? Int else {
|
|
return self
|
|
}
|
|
return RDReaderCommon.PageCurlType(rawValue: value) ?? self
|
|
}
|
|
}
|
|
}
|
|
|
|
extension RDReaderCommon {
|
|
|
|
enum Colors: Int, RDReaderObserverType{
|
|
|
|
case white, dark, pink, yellow, green, blue
|
|
var value: RDReaderTheme {
|
|
switch self {
|
|
case .white:
|
|
return whiteTheme
|
|
case .dark:
|
|
return darkTheme
|
|
case .pink:
|
|
return pinkTheme
|
|
case .yellow:
|
|
return yellowTheme
|
|
case .green:
|
|
return greenTheme
|
|
case .blue:
|
|
return blueTheme
|
|
}
|
|
}
|
|
var cachesValue: Int {
|
|
rawValue
|
|
}
|
|
|
|
var color: UIColor {
|
|
switch self {
|
|
case .white:
|
|
return UIColor(red: 0.98, green: 0.98, blue: 0.99, alpha: 1)
|
|
case .yellow:
|
|
return UIColor(red: 0.89, green: 0.87, blue: 0.79, alpha: 1)
|
|
case .green:
|
|
return UIColor(red: 0.87, green: 0.91, blue: 0.82, alpha: 1)
|
|
case .pink:
|
|
return UIColor(red: 1, green: 0.89, blue: 0.91, alpha: 1)
|
|
case .blue:
|
|
return UIColor(red: 0.8, green: 0.84, blue: 0.89, alpha: 1)
|
|
case .dark:
|
|
return UIColor(red: 0.09, green: 0.09, blue: 0.09, alpha: 1)
|
|
}
|
|
}
|
|
|
|
func transform(value: Any?) -> RDReaderCommon.Colors {
|
|
guard let value = value as? Int else {
|
|
return self
|
|
}
|
|
return RDReaderCommon.Colors(rawValue: value) ?? self
|
|
}
|
|
}
|
|
static let whiteTheme = WhiteTheme()
|
|
static let darkTheme = DarkTheme()
|
|
static let pinkTheme = PinkTheme()
|
|
static let yellowTheme = YellowTheme()
|
|
static let greenTheme = GreenTheme()
|
|
static let blueTheme = BlueTheme()
|
|
|
|
}
|
|
|
|
|
|
extension NSAttributedString {
|
|
func pageRanges(size: CGSize) -> [NSRange] {
|
|
var ranges = [NSRange]()
|
|
let framesetter = CTFramesetterCreateWithAttributedString(self)
|
|
let path = CGPath(rect: CGRect(origin: .zero, size: size), transform: nil)
|
|
var range = CFRangeMake(0, 0)
|
|
var loc = 0
|
|
while range.location + range.length < length {
|
|
let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(loc, 0), path, nil)
|
|
range = CTFrameGetVisibleStringRange(frame)
|
|
ranges.append(NSMakeRange(loc, range.length))
|
|
loc += range.length
|
|
}
|
|
return ranges
|
|
}
|
|
}
|
|
|
|
|
|
extension String {
|
|
static func encodeTextFile(url: URL?) -> String {
|
|
var content: String? = nil
|
|
guard let url = url else {
|
|
return content ?? ""
|
|
}
|
|
content = try? NSString(contentsOf: url, encoding: String.Encoding.utf8.rawValue) as String
|
|
if content == nil {
|
|
content = try? NSString(contentsOf: url, encoding: 0x80000632) as String
|
|
}
|
|
if content == nil {
|
|
content = try? NSString(contentsOf: url, encoding: 0x80000631) as String
|
|
}
|
|
return content ?? ""
|
|
}
|
|
}
|