ReadViewSDK/Sources/RDReaderView/LegacyRDReaderController/RDReaderEditView.swift
2026-05-21 19:40:51 +08:00

500 lines
16 KiB
Swift

//
// RDReaderEditView.swift
// RDReaderDemo
//
// Created by yangsq on 2021/8/19.
//
import UIKit
import SnapKit
///
class RDReaderBrightSlider: UISlider, SSEventTrigger {
enum Event {
case valueDidChange(value: CGFloat)
}
override init(frame: CGRect) {
super.init(frame: frame)
makeUI()
}
override func setValue(_ value: Float, animated: Bool) {
super.setValue(value, animated: animated)
UIScreen.main.brightness = CGFloat(value)
if let trigger = self.triggerEvent {
trigger(.valueDidChange(value: CGFloat(value)))
}
}
func makeUI() {
let color = UIColor(red: 0.97, green: 0.97, blue: 0.97, alpha: 1)
thumbTintColor = color
let image = UIImage.rdToolbarImage(named: "read_edit_slide", fallbackSystemName: "circle.fill")
setThumbImage(image, for: .normal)
setThumbImage(image, for: .highlighted)
minimumValueImage = UIImage.rdToolbarImage(named: "read_edit_bright_min", fallbackSystemName: "sun.min.fill")
maximumValueImage = UIImage.rdToolbarImage(named: "read_edit_bright_max", fallbackSystemName: "sun.max.fill")
}
override func trackRect(forBounds bounds: CGRect) -> CGRect {
self.layer.cornerRadius = 2.5 / 2
return CGRect(x: 30, y: (bounds.height - 2.5)/2, width: bounds.width - 30 * 2, height: 2.5)
}
override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect {
// print(value)
return CGRect(x: 30 + (bounds.width - 30 * 2 - 16) * CGFloat(value), y: (bounds.height - 16)/2, width: 16, height: 16)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
///
class RDReaderFontView: UIView, SSEventTrigger {
enum Event {
case fontSize(size: CGFloat)
}
var maxFontSize: CGFloat = 30
var minFontSize: CGFloat = 15
var currentFontSize: CGFloat = 15 {
didSet {
fontLabel.text = "\(Int(currentFontSize))"
if currentFontSize != oldValue {
if let trigger = self.triggerEvent {
trigger(.fontSize(size: currentFontSize))
}
}
}
}
lazy var reduceButton: UIButton = {
let button = UIButton(type: .system)
button.setImage(UIImage.rdToolbarImage(named: "read_edit_font_reduce", fallbackSystemName: "textformat.size.smaller"), for: .normal)
button.layer.cornerRadius = 37 / 2
button.backgroundColor = UIColor.lightGray.withAlphaComponent(0.2)
return button
}()
lazy var increaseButton: UIButton = {
let button = UIButton(type: .system)
button.setImage(UIImage.rdToolbarImage(named: "read_edit_font_increase", fallbackSystemName: "textformat.size.larger"), for: .normal)
button.layer.cornerRadius = 37 / 2
button.backgroundColor = UIColor.lightGray.withAlphaComponent(0.2)
return button
}()
lazy var fontLabel: UILabel = {
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 17)
label.textAlignment = .center
return label
}()
private lazy var containerView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .fill
stackView.spacing = 0
return stackView
}()
override init(frame: CGRect) {
super.init(frame: frame)
makeUI()
}
func makeUI() {
addSubview(containerView)
containerView.addArrangedSubview(reduceButton)
containerView.addArrangedSubview(fontLabel)
containerView.addArrangedSubview(increaseButton)
containerView.snp.makeConstraints { make in
make.edges.equalTo(0)
}
reduceButton.snp.makeConstraints { make in
make.width.equalTo(increaseButton.snp.width).priority(.high)
make.height.equalTo(37)
}
increaseButton.snp.makeConstraints { make in
make.height.equalTo(37)
}
fontLabel.snp.makeConstraints { make in
make.width.equalTo(50)
}
reduceButton.addTarget(self, action: #selector(reduceAction(button:)), for: .touchUpInside)
increaseButton.addTarget(self, action: #selector(increaseAction(button:)), for: .touchUpInside)
fontLabel.text = "\(Int(currentFontSize))"
}
@objc func reduceAction(button: UIButton) {
if currentFontSize == minFontSize {
return
}
currentFontSize -= 1
}
@objc func increaseAction(button: UIButton) {
if currentFontSize == maxFontSize {
return
}
currentFontSize += 1
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
///
class RDReaderLineSpaceView: UIView, SSEventTrigger {
enum Event {
case chose(type: RDReaderCommon.SpaceType)
}
private lazy var containerView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.spacing = 10
return stackView
}()
private var buttons = [UIButton]()
let allTypes: [RDReaderCommon.SpaceType] = [.min, .meduim, .max]
var currentType: RDReaderCommon.SpaceType = .min {
didSet {
let index = allTypes.firstIndex(of: currentType)
let button = buttons[index!]
button.sendActions(for: .touchUpInside)
}
}
override init(frame: CGRect) {
super.init(frame: frame)
makeUI()
}
func makeUI() {
addSubview(containerView)
containerView.snp.makeConstraints { make in
make.edges.equalTo(0)
}
allTypes.forEach { type in
let button = UIButton(type: .system)
button.layer.cornerRadius = 37 / 2
button.layer.borderWidth = 1
button.layer.borderColor = UIColor.lightGray.withAlphaComponent(0.5).cgColor
button.setImage(type.image?.withRenderingMode(.alwaysOriginal), for: .normal)
containerView.addArrangedSubview(button)
button.addTarget(self, action: #selector(buttonAction(button:)), for: .touchUpInside)
button.snp.makeConstraints { make in
make.height.equalTo(37)
}
buttons.append(button)
if type == .min {
button.sendActions(for: .touchUpInside)
}
}
}
@objc func buttonAction(button: UIButton) {
for btn in buttons {
if btn == button {
btn.layer.borderColor = UIColor.black.cgColor
let index = buttons.firstIndex(of: btn)
let type = allTypes[index!]
if let trigger = self.triggerEvent {
trigger(.chose(type: type))
}
} else {
btn.layer.borderColor = UIColor.lightGray.withAlphaComponent(0.5).cgColor
}
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
///
class RDReaderPageCurlTypeView: UIView, SSEventTrigger {
enum Event {
case chose(type: RDReaderCommon.PageCurlType)
}
private lazy var scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.showsVerticalScrollIndicator = false
scrollView.showsHorizontalScrollIndicator = false
return scrollView
}()
private lazy var containerView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .equalSpacing
stackView.spacing = 10
return stackView
}()
var currentType: RDReaderCommon.PageCurlType = .pageCurl {
didSet {
let index = allTypes.firstIndex(of: currentType)
let button = buttons[index!]
button.sendActions(for: .touchUpInside)
}
}
private var buttons = [UIButton]()
let allTypes: [RDReaderCommon.PageCurlType] = [.pageCurl, .horizontalScroll, .verticalScroll, .horizontalCoverScroll]
override init(frame: CGRect) {
super.init(frame: frame)
makeUI()
}
func makeUI() {
addSubview(scrollView)
scrollView.addSubview(containerView)
scrollView.snp.makeConstraints { make in
make.edges.equalTo(0)
}
containerView.snp.makeConstraints { make in
make.edges.equalTo(0)
}
allTypes.forEach { type in
let button = UIButton(type: .system)
button.layer.cornerRadius = 37 / 2
button.layer.borderWidth = 1
button.titleLabel?.font = UIFont.systemFont(ofSize: 17)
button.setTitleColor(UIColor.black, for: .normal)
button.layer.borderColor = UIColor.lightGray.withAlphaComponent(0.5).cgColor
button.setTitle(type.title, for: .normal)
let size = button.titleLabel!.sizeThatFits(CGSize(width: CGFloat(MAXFLOAT), height: 37))
containerView.addArrangedSubview(button)
button.addTarget(self, action: #selector(buttonAction(button:)), for: .touchUpInside)
button.snp.makeConstraints { make in
make.height.equalTo(37)
make.width.equalTo(size.width + 30)
}
buttons.append(button)
if type == .pageCurl {
button.sendActions(for: .touchUpInside)
}
}
}
@objc func buttonAction(button: UIButton) {
for btn in buttons {
if btn == button {
btn.layer.borderColor = UIColor.black.cgColor
let index = buttons.firstIndex(of: btn)
let type = allTypes[index!]
if let trigger = self.triggerEvent {
trigger(.chose(type: type))
}
} else {
btn.layer.borderColor = UIColor.lightGray.withAlphaComponent(0.5).cgColor
}
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
///
class RDReaderThemeColorsView: UIView, SSEventTrigger {
enum Event {
case chose(color: RDReaderCommon.Colors)
}
private lazy var scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.showsVerticalScrollIndicator = false
scrollView.showsHorizontalScrollIndicator = false
return scrollView
}()
private lazy var containerView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .equalSpacing
stackView.spacing = 30
return stackView
}()
var currentType: RDReaderCommon.Colors = .white {
didSet {
let index = allTypes.firstIndex(of: currentType)
let button = buttons[index!]
button.sendActions(for: .touchUpInside)
}
}
private var buttons = [UIButton]()
let allTypes: [RDReaderCommon.Colors] = [.white, .yellow, .green, .pink, .blue, .dark]
override init(frame: CGRect) {
super.init(frame: frame)
makeUI()
}
func makeUI() {
addSubview(scrollView)
scrollView.addSubview(containerView)
scrollView.snp.makeConstraints { make in
make.edges.equalTo(0)
}
containerView.snp.makeConstraints { make in
make.edges.equalTo(0)
}
allTypes.forEach { type in
let button = UIButton(type: .system)
button.layer.cornerRadius = 37 / 2
button.titleLabel?.font = UIFont.systemFont(ofSize: 17)
button.layer.borderColor = UIColor.black.cgColor
button.backgroundColor = type.color
containerView.addArrangedSubview(button)
button.addTarget(self, action: #selector(buttonAction(button:)), for: .touchUpInside)
button.snp.makeConstraints { make in
make.height.width.equalTo(37)
}
buttons.append(button)
if type == .white {
button.sendActions(for: .touchUpInside)
}
}
}
@objc func buttonAction(button: UIButton) {
for btn in buttons {
if btn == button {
btn.layer.borderWidth = 1
let index = buttons.firstIndex(of: btn)
let type = allTypes[index!]
if let trigger = self.triggerEvent {
trigger(.chose(color: type))
}
} else {
btn.layer.borderWidth = 0
}
}
}
override func layoutSubviews() {
super.layoutSubviews()
let space = (frame.width - CGFloat(allTypes.count) * 37) / CGFloat(allTypes.count - 1)
containerView.spacing = space
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
///
class RDReaderEditView: UIView {
lazy var lineView: UIView = {
let view = UIView()
view.backgroundColor = UIColor.lightGray
return view
}()
lazy var brightSlider: RDReaderBrightSlider = {
let slider = RDReaderBrightSlider()
return slider
}()
lazy var fontView: RDReaderFontView = {
let view = RDReaderFontView()
return view
}()
lazy var lineSpaceView: RDReaderLineSpaceView = {
let view = RDReaderLineSpaceView()
return view
}()
lazy var pageCurlTypeView: RDReaderPageCurlTypeView = {
let view = RDReaderPageCurlTypeView()
return view
}()
lazy var colorView: RDReaderThemeColorsView = {
let view = RDReaderThemeColorsView()
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
makeUI()
}
func makeUI() {
backgroundColor = .white
addSubview(lineView)
addSubview(brightSlider)
addSubview(fontView)
addSubview(lineSpaceView)
addSubview(pageCurlTypeView)
addSubview(colorView)
lineView.snp.makeConstraints { make in
make.left.right.top.equalTo(0)
make.height.equalTo(0.5)
}
brightSlider.snp.makeConstraints { make in
make.top.equalTo(20)
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(20)
}
fontView.snp.makeConstraints { make in
make.top.equalTo(brightSlider.snp.bottom).offset(20)
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(37)
}
lineSpaceView.snp.makeConstraints { make in
make.top.equalTo(fontView.snp.bottom).offset(20)
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(37)
}
pageCurlTypeView.snp.makeConstraints { make in
make.top.equalTo(lineSpaceView.snp.bottom).offset(20)
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(37)
}
colorView.snp.makeConstraints { make in
make.top.equalTo(pageCurlTypeView.snp.bottom).offset(20)
make.left.equalTo(16)
make.right.equalTo(-16)
make.height.equalTo(37)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}