500 lines
16 KiB
Swift
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")
|
|
}
|
|
|
|
}
|