Files
ReadViewSDK/Sources/RDReaderView/EPUBUI/RDEPUBReaderTopToolView.swift
T
shenandshen 54798ba578 refactor: 添加中文注释 + 优化模块结构
- 给全部 78 个 Swift 源文件添加详细的中文注释(文件级、类级、方法级)
- 删除 LegacyRDReaderController/ 死代码目录(16 文件 4592 行)
- 根目录翻页容器文件移入 ReaderView/ 目录
- Resources/ 移入 EPUBCore/Resources/(与使用者归属一致)
- RDEPUBTextIndexTable.swift 移入 EPUBTextRendering/(消除反向依赖)
- RDURLReaderController.swift 移入 EPUBUI/(入口控制器归入 UI 层)
- 更新 podspec 资源路径
2026-05-25 10:19:14 +08:00

119 lines
4.6 KiB
Swift

import UIKit
// MARK: - 顶部工具栏
/// 阅读器顶部工具栏
/// 显示书名、返回按钮和书签按钮
/// 位于阅读内容上方,支持 iOS 13+ SF Symbols 和低版本文字回退
public final class RDEPUBReaderTopToolView: RDEPUBReaderToolView {
/// 返回按钮点击回调
var onBack: (() -> Void)?
/// 书签按钮点击回调
var onToggleBookmark: (() -> Void)?
private let backButton = RDEPUBReaderTintButton(type: .system)
private let bookmarkButton = RDEPUBReaderTintButton(type: .system)
private let titleLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.font = UIFont.systemFont(ofSize: 16, weight: .semibold)
label.numberOfLines = 1
return label
}()
private var isBookmarked = false
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .white
addSubview(backButton)
addSubview(bookmarkButton)
addSubview(titleLabel)
backButton.translatesAutoresizingMaskIntoConstraints = false
bookmarkButton.translatesAutoresizingMaskIntoConstraints = false
titleLabel.translatesAutoresizingMaskIntoConstraints = false
backButton.addTarget(self, action: #selector(backAction), for: .touchUpInside)
bookmarkButton.addTarget(self, action: #selector(bookmarkAction), for: .touchUpInside)
NSLayoutConstraint.activate([
backButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8),
backButton.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 4),
backButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -4),
backButton.widthAnchor.constraint(equalToConstant: 44),
backButton.heightAnchor.constraint(equalToConstant: 44),
bookmarkButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8),
bookmarkButton.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 4),
bookmarkButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -4),
bookmarkButton.widthAnchor.constraint(equalToConstant: 44),
bookmarkButton.heightAnchor.constraint(equalToConstant: 44),
titleLabel.leadingAnchor.constraint(equalTo: backButton.trailingAnchor, constant: 8),
titleLabel.trailingAnchor.constraint(equalTo: bookmarkButton.leadingAnchor, constant: -8),
titleLabel.centerYAnchor.constraint(equalTo: backButton.centerYAnchor)
])
if #available(iOS 13.0, *) {
backButton.setImage(UIImage(systemName: "chevron.left")?.withRenderingMode(.alwaysTemplate), for: .normal)
} else {
backButton.setTitle("返回", for: .normal)
}
backButton.accessibilityIdentifier = "epub.reader.back"
bookmarkButton.accessibilityIdentifier = "epub.reader.bookmark"
titleLabel.accessibilityIdentifier = "epub.reader.title"
updateBookmarkButtonAppearance()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override public func lineFrame(in bounds: CGRect) -> CGRect {
CGRect(x: 0, y: bounds.height - 0.5, width: bounds.width, height: 0.5)
}
override public func apply(theme: RDEPUBReaderTheme) {
super.apply(theme: theme)
titleLabel.textColor = .black
backButton.tintColor = .black
bookmarkButton.tintColor = .black
if #unavailable(iOS 13.0) {
backButton.setTitleColor(.black, for: .normal)
bookmarkButton.setTitleColor(.black, for: .normal)
}
updateBookmarkButtonAppearance()
}
func setTitle(_ title: String?) {
titleLabel.text = title
}
func setBookmarkSelected(_ isSelected: Bool) {
isBookmarked = isSelected
updateBookmarkButtonAppearance()
}
func setBookmarkEnabled(_ isEnabled: Bool) {
bookmarkButton.isEnabled = isEnabled
bookmarkButton.alpha = isEnabled ? 1 : 0.45
}
@objc private func backAction() {
onBack?()
}
@objc private func bookmarkAction() {
onToggleBookmark?()
}
private func updateBookmarkButtonAppearance() {
if #available(iOS 13.0, *) {
let imageName = isBookmarked ? "bookmark.fill" : "bookmark"
bookmarkButton.setImage(UIImage(systemName: imageName)?.withRenderingMode(.alwaysTemplate), for: .normal)
} else {
bookmarkButton.setTitle(isBookmarked ? "已签" : "书签", for: .normal)
}
}
}