修复bug

This commit is contained in:
澜声世纪 2025-12-25 14:50:08 +08:00
parent f9f5b83e20
commit 17d83f3b7a
19 changed files with 168 additions and 34 deletions

View File

@ -17,6 +17,10 @@ class NRViewController: UIViewController {
lazy var nr_isEditing = false lazy var nr_isEditing = false
private(set) var isViewDidAppear = false
///
private(set) var enteredViewDidAppear = false
lazy var backgroundImageView: UIImageView = { lazy var backgroundImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "bg_image_01")) let imageView = UIImageView(image: UIImage(named: "bg_image_01"))
return imageView return imageView
@ -51,6 +55,22 @@ class NRViewController: UIViewController {
} }
} }
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
isViewDidAppear = true
enteredViewDidAppear = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
isViewDidAppear = false
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
isViewDidAppear = false
}
func handleHeaderRefresh(_ completer: (() -> Void)?) { func handleHeaderRefresh(_ completer: (() -> Void)?) {
completer?() completer?()

View File

@ -86,7 +86,4 @@ extension NRHomeNovelMustReadTodayView: FSPagerViewDataSource, FSPagerViewDelega
vc.novelId = dataArr[index].id ?? "" vc.novelId = dataArr[index].id ?? ""
self.viewController?.navigationController?.pushViewController(vc, animated: true) self.viewController?.navigationController?.pushViewController(vc, animated: true)
} }
// UICollectionViewContentInset FSPagerView itemSize transformer
// transform
} }

View File

@ -21,6 +21,8 @@ class NRMyListNovelViewController: NRViewController {
lazy var dataArr: [NRNovelModel] = [] lazy var dataArr: [NRNovelModel] = []
lazy var page = 1 lazy var page = 1
private var isNeedUpdate = false
lazy var collectionViewLayout: UICollectionViewFlowLayout = { lazy var collectionViewLayout: UICollectionViewFlowLayout = {
let itemWidth = (UIScreen.width - 32 - 40) / 3 let itemWidth = (UIScreen.width - 32 - 40) / 3
let itemHeight = 150 / 100 * itemWidth + 68 let itemHeight = 150 / 100 * itemWidth + 68
@ -49,17 +51,34 @@ class NRMyListNovelViewController: NRViewController {
return collectionView return collectionView
}() }()
@MainActor deinit {
NotificationCenter.default.removeObserver(self)
}
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
self.backgroundImageView.isHidden = true self.backgroundImageView.isHidden = true
self.view.backgroundColor = .clear self.view.backgroundColor = .clear
NotificationCenter.default.addObserver(self, selector: #selector(updateCollectStateNotification), name: NRNovelAPI.updateCollectStateNotification, object: nil)
nr_setupUI() nr_setupUI()
Task { Task {
await requestDataArr(page: 1) await requestDataArr(page: 1)
} }
} }
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if isNeedUpdate {
Task {
await requestDataArr(page: 1)
}
}
}
override func handleHeaderRefresh(_ completer: (() -> Void)?) { override func handleHeaderRefresh(_ completer: (() -> Void)?) {
Task { Task {
await requestDataArr(page: 1) await requestDataArr(page: 1)
@ -74,6 +93,12 @@ class NRMyListNovelViewController: NRViewController {
} }
} }
@objc private func updateCollectStateNotification() {
if !isViewDidAppear {
isNeedUpdate = true
}
}
} }
extension NRMyListNovelViewController { extension NRMyListNovelViewController {

View File

@ -20,6 +20,14 @@ class NRMyListViewController: NRViewController {
lazy var novelVC = NRMyListNovelViewController() lazy var novelVC = NRMyListNovelViewController()
lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 16, weight: .semibold)
label.textColor = .black
label.text = "My List".localized
return label
}()
lazy var editButton: UIButton = { lazy var editButton: UIButton = {
let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in
guard let self = self else { return } guard let self = self else { return }
@ -53,10 +61,16 @@ class NRMyListViewController: NRViewController {
extension NRMyListViewController { extension NRMyListViewController {
private func nr_setupUI() { private func nr_setupUI() {
view.addSubview(titleLabel)
view.addSubview(editButton) view.addSubview(editButton)
addChild(novelVC) addChild(novelVC)
view.addSubview(novelVC.view) view.addSubview(novelVC.view)
titleLabel.snp.makeConstraints { make in
make.centerY.equalTo(editButton)
make.left.equalToSuperview().offset(16)
}
editButton.snp.makeConstraints { make in editButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-6) make.right.equalToSuperview().offset(-6)
make.top.equalToSuperview().offset(UIScreen.safeTop) make.top.equalToSuperview().offset(UIScreen.safeTop)

View File

@ -73,7 +73,7 @@ class NRReadChapterModel: NSObject, SmartCodable {
/// ///
func parserEmpty(_ text: String) { func parserEmpty(_ text: String) {
fullContent = NSMutableAttributedString(string: "\n\n\n\n\n" + text, attributes: NRNovelReadSetManager.manager.attributes(isTitle: false)) fullContent = NSMutableAttributedString(string: "\n\n\n\n\n\n\n" + text, attributes: NRNovelReadSetManager.manager.emptyAttributes())
let pageModel = NRReadPageModel() let pageModel = NRReadPageModel()
pageModel.content = fullContent pageModel.content = fullContent

View File

@ -60,6 +60,8 @@ extension NRNovelDetailHeaderView {
let label = UILabel() let label = UILabel()
label.font = .font(ofSize: 14, weight: .medium) label.font = .font(ofSize: 14, weight: .medium)
label.textColor = .white label.textColor = .white
label.numberOfLines = 0
label.textAlignment = .center
return label return label
}() }()
@ -101,6 +103,7 @@ extension NRNovelDetailHeaderView {
} }
stackView.snp.makeConstraints { make in stackView.snp.makeConstraints { make in
make.top.equalTo(nameLabel.snp.bottom).offset(12)
make.centerX.equalToSuperview() make.centerX.equalToSuperview()
make.bottom.equalToSuperview().offset(-16) make.bottom.equalToSuperview().offset(-16)
} }

View File

@ -269,7 +269,7 @@ extension NRNovelDetailHeaderView {
coverInfoView.snp.makeConstraints { make in coverInfoView.snp.makeConstraints { make in
make.left.centerX.equalToSuperview() make.left.centerX.equalToSuperview()
make.top.equalToSuperview().offset(UIScreen.navBarHeight) make.top.equalToSuperview().offset(UIScreen.navBarHeight)
make.height.equalTo(240) // make.height.equalTo(240)
} }
contentView.snp.makeConstraints { make in contentView.snp.makeConstraints { make in

View File

@ -125,6 +125,7 @@ extension NRNovelDetailMoreLikeCell {
categoryView.snp.makeConstraints { make in categoryView.snp.makeConstraints { make in
make.left.equalToSuperview() make.left.equalToSuperview()
make.right.lessThanOrEqualToSuperview()
make.bottom.equalToSuperview() make.bottom.equalToSuperview()
} }

View File

@ -30,6 +30,7 @@ class NRNovelCatalogCell: NRTableViewCell {
private lazy var titleLabel: UILabel = { private lazy var titleLabel: UILabel = {
let label = UILabel() let label = UILabel()
label.font = .font(ofSize: 12, weight: .regular) label.font = .font(ofSize: 12, weight: .regular)
label.numberOfLines = 0
return label return label
}() }()
@ -68,6 +69,7 @@ extension NRNovelCatalogCell {
contentView.addSubview(lockImageView) contentView.addSubview(lockImageView)
titleLabel.snp.makeConstraints { make in titleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(14)
make.centerY.equalToSuperview() make.centerY.equalToSuperview()
make.left.equalToSuperview().offset(16) make.left.equalToSuperview().offset(16)
make.right.lessThanOrEqualToSuperview().offset(-70) make.right.lessThanOrEqualToSuperview().offset(-70)

View File

@ -84,7 +84,12 @@ class NRNovelReadBottomView: UIView {
lazy var nextButton: UIButton = { lazy var nextButton: UIButton = {
let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in
guard let self = self else { return } guard let self = self else { return }
self.viewModel?.skipToNextChapter() guard let (catalogModel, _) = self.viewModel?.getCurrentPageData() else { return }
if catalogModel?.is_lock != true {
self.viewModel?.skipToNextChapter()
} else {
self.viewModel?.openRechargeView()
}
})) }))
button.titleLabel?.font = .font(ofSize: 12, weight: .regular) button.titleLabel?.font = .font(ofSize: 12, weight: .regular)
button.setTitle("Next".localized, for: .normal) button.setTitle("Next".localized, for: .normal)

View File

@ -9,6 +9,7 @@ import UIKit
import HWPanModal import HWPanModal
import SnapKit import SnapKit
import Cosmos import Cosmos
import YYCategories
class NRNovelReadGradeView: NRPanModalContentView { class NRNovelReadGradeView: NRPanModalContentView {
@ -37,6 +38,28 @@ class NRNovelReadGradeView: NRPanModalContentView {
return imageView return imageView
}() }()
private lazy var moreButton: UIControl = {
let button = UIControl()
button.addAction(UIAction(handler: { [weak self] _ in
guard let self = self else { return }
self.dismiss(animated: true) { }
let nav = NRTool.topViewController?.navigationController
guard let vcArr = nav?.viewControllers, vcArr.count > 0 else { return }
if vcArr.count > 1, vcArr[vcArr.count - 2].isKind(of: NRNovelDetailViewController.self) {
var newVCArr = vcArr
newVCArr.removeLast()
nav?.setViewControllers(newVCArr, animated: true)
} else {
let vc = NRNovelDetailViewController()
vc.novelId = self.model?.id ?? ""
nav?.pushViewController(vc, animated: true)
}
}), for: .touchUpInside)
return button
}()
private lazy var nameLabel: UILabel = { private lazy var nameLabel: UILabel = {
let label = UILabel() let label = UILabel()
label.font = .font(ofSize: 14, weight: .medium) label.font = .font(ofSize: 14, weight: .medium)
@ -44,6 +67,13 @@ class NRNovelReadGradeView: NRPanModalContentView {
return label return label
}() }()
private lazy var indicatorImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "arrow_right_icon_04"))
imageView.setContentHuggingPriority(.required, for: .horizontal)
imageView.setContentCompressionResistancePriority(.required, for: .horizontal)
return imageView
}()
private lazy var starView: NRStarGradeView = { private lazy var starView: NRStarGradeView = {
let view = NRStarGradeView() let view = NRStarGradeView()
return view return view
@ -130,7 +160,9 @@ class NRNovelReadGradeView: NRPanModalContentView {
extension NRNovelReadGradeView { extension NRNovelReadGradeView {
private func nr_setupUI() { private func nr_setupUI() {
addSubview(coverImageView) addSubview(coverImageView)
addSubview(nameLabel) addSubview(moreButton)
moreButton.addSubview(nameLabel)
moreButton.addSubview(indicatorImageView)
addSubview(starView) addSubview(starView)
addSubview(categoryView) addSubview(categoryView)
addSubview(gradeView) addSubview(gradeView)
@ -142,10 +174,22 @@ extension NRNovelReadGradeView {
make.height.equalTo(90) make.height.equalTo(90)
} }
nameLabel.snp.makeConstraints { make in moreButton.snp.makeConstraints { make in
make.top.equalTo(coverImageView).offset(8) make.top.equalTo(coverImageView).offset(8)
make.left.equalTo(coverImageView.snp.right).offset(12) make.left.equalTo(coverImageView.snp.right).offset(12)
make.right.lessThanOrEqualToSuperview().offset(-16) make.right.equalToSuperview().offset(-16)
}
nameLabel.snp.makeConstraints { make in
make.left.equalToSuperview()
make.centerY.equalToSuperview()
make.top.equalToSuperview()
make.right.lessThanOrEqualTo(indicatorImageView.snp.left).offset(-10)
}
indicatorImageView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.right.equalToSuperview()
} }
starView.snp.makeConstraints { make in starView.snp.makeConstraints { make in

View File

@ -22,13 +22,13 @@ class NRNovelReadStarGradeView: UIView {
if self_rate < 0 { if self_rate < 0 {
label.text = "Enjoying this book?".localized label.text = "Enjoying this book?".localized
gradeView.grade = 0 gradeView.grade = 0
gradeView.updateOnTouch = true // gradeView.updateOnTouch = true
gradeView.fillMode = .full // gradeView.fillMode = .full
} else { } else {
label.text = "My Rate##".localizedReplace(text: NSNumber(value: self_rate).toString(maximumFractionDigits: 1, minimumFractionDigits: 1)) label.text = "My Rate##".localizedReplace(text: NSNumber(value: self_rate).toString(maximumFractionDigits: 1, minimumFractionDigits: 1))
gradeView.grade = self_rate / 2 gradeView.grade = self_rate / 2
gradeView.updateOnTouch = false // gradeView.updateOnTouch = false
gradeView.fillMode = .precise // gradeView.fillMode = .precise
} }
} }
} }
@ -44,7 +44,7 @@ class NRNovelReadStarGradeView: UIView {
let view = NRStarGradeView() let view = NRStarGradeView()
view.filledImage = UIImage(named: "star_icon_04") view.filledImage = UIImage(named: "star_icon_04")
view.emptyImage = UIImage(named: "star_icon_05") view.emptyImage = UIImage(named: "star_icon_05")
view.updateOnTouch = false view.updateOnTouch = true
view.fillMode = .full view.fillMode = .full
view.didFinishTouching = self.didFinishTouchingGrade view.didFinishTouching = self.didFinishTouchingGrade
return view return view

View File

@ -56,6 +56,7 @@ class NRNovelReaderCatalogView: UIView {
let label = UILabel() let label = UILabel()
label.font = .font(ofSize: 14, weight: .medium) label.font = .font(ofSize: 14, weight: .medium)
label.textColor = .black label.textColor = .black
label.numberOfLines = 0
return label return label
}() }()
@ -84,7 +85,7 @@ class NRNovelReaderCatalogView: UIView {
tableView.delegate = self tableView.delegate = self
tableView.dataSource = self tableView.dataSource = self
tableView.separatorStyle = .none tableView.separatorStyle = .none
tableView.rowHeight = 44 // tableView.rowHeight = 44
tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.safeBottom, right: 0) tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.safeBottom, right: 0)
tableView.register(NRNovelCatalogCell.self, forCellReuseIdentifier: "cell") tableView.register(NRNovelCatalogCell.self, forCellReuseIdentifier: "cell")
return tableView return tableView

View File

@ -22,7 +22,6 @@ class NRNovelDetailCatalogViewController: NRViewController {
lazy var dataArr: [NRReadChapterCatalogModel] = [] lazy var dataArr: [NRReadChapterCatalogModel] = []
var isViewDidAppear = false
private lazy var lineView: UIView = { private lazy var lineView: UIView = {
@ -41,6 +40,7 @@ class NRNovelDetailCatalogViewController: NRViewController {
let label = UILabel() let label = UILabel()
label.font = .font(ofSize: 14, weight: .medium) label.font = .font(ofSize: 14, weight: .medium)
label.textColor = .black label.textColor = .black
label.numberOfLines = 0
return label return label
}() }()
@ -56,7 +56,7 @@ class NRNovelDetailCatalogViewController: NRViewController {
tableView.delegate = self tableView.delegate = self
tableView.dataSource = self tableView.dataSource = self
tableView.separatorStyle = .none tableView.separatorStyle = .none
tableView.rowHeight = 44 // tableView.rowHeight = 44
tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.safeBottom, right: 0) tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.safeBottom, right: 0)
tableView.register(NRNovelCatalogCell.self, forCellReuseIdentifier: "cell") tableView.register(NRNovelCatalogCell.self, forCellReuseIdentifier: "cell")
return tableView return tableView
@ -83,15 +83,13 @@ class NRNovelDetailCatalogViewController: NRViewController {
} }
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) if enteredViewDidAppear {
if isViewDidAppear {
Task { Task {
await requestDataArr() await requestDataArr()
} }
} else {
isViewDidAppear = true
} }
super.viewDidAppear(animated)
} }
} }

View File

@ -23,7 +23,6 @@ class NRNovelDetailViewController: NRViewController {
private var navigationStyleScale: CGFloat = 0 private var navigationStyleScale: CGFloat = 0
private lazy var isViewDidAppear = false
lazy var coverBgImageView: NRImageView = { lazy var coverBgImageView: NRImageView = {
let imageView = NRImageView() let imageView = NRImageView()
@ -70,6 +69,7 @@ class NRNovelDetailViewController: NRViewController {
@MainActor deinit { @MainActor deinit {
recommandListView.removeObserver(self, forKeyPath: "contentSize") recommandListView.removeObserver(self, forKeyPath: "contentSize")
NotificationCenter.default.removeObserver(self)
} }
override func viewDidLoad() { override func viewDidLoad() {
@ -77,6 +77,8 @@ class NRNovelDetailViewController: NRViewController {
self.edgesForExtendedLayout = [.top] self.edgesForExtendedLayout = [.top]
self.view.backgroundColor = .white self.view.backgroundColor = .white
NotificationCenter.default.addObserver(self, selector: #selector(updateCollectStateNotification), name: NRNovelAPI.updateCollectStateNotification, object: nil)
recommandListView.addObserver(self, forKeyPath: "contentSize", context: nil) recommandListView.addObserver(self, forKeyPath: "contentSize", context: nil)
nr_setupUI() nr_setupUI()
@ -98,15 +100,13 @@ class NRNovelDetailViewController: NRViewController {
} }
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) if enteredViewDidAppear {
if !isViewDidAppear {
isViewDidAppear = true
} else {
Task { Task {
await updateData() await updateData()
} }
} }
super.viewDidAppear(animated)
} }
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
@ -133,6 +133,15 @@ class NRNovelDetailViewController: NRViewController {
} }
} }
@objc private func updateCollectStateNotification(sender: Notification) {
guard let userInfo = sender.userInfo else { return }
guard let id = userInfo["id"] as? String else { return }
guard id == self.novelId else { return }
Task {
await updateDetail()
}
}
} }
@ -263,14 +272,17 @@ extension NRNovelDetailViewController {
} }
extension NRNovelDetailViewController { extension NRNovelDetailViewController {
private func updateData() async {
private func updateDetail() async {
await self.viewModel.requestDetailData() await self.viewModel.requestDetailData()
self.coverBgImageView.nr_setImage(self.viewModel.novelModel?.image_url) self.coverBgImageView.nr_setImage(self.viewModel.novelModel?.image_url)
self.headerView.model = self.viewModel.novelModel self.headerView.model = self.viewModel.novelModel
}
private func updateData() async {
await self.updateDetail()
await self.viewModel.requestRecommandData() await self.viewModel.requestRecommandData()
self.recommandVC.dataArr = self.viewModel.recommandDataArr ?? [] self.recommandVC.dataArr = self.viewModel.recommandDataArr ?? []
} }
} }

View File

@ -159,6 +159,7 @@ extension NRNovelReaderViewController {
let (currentCatalogModel, _) = self.viewModel.getCurrentPageData() let (currentCatalogModel, _) = self.viewModel.getCurrentPageData()
if currentCatalogModel?.is_lock == true { if currentCatalogModel?.is_lock == true {
self.viewModel.openRechargeView()
return nil return nil
} else { } else {
let (catalogModel, pageModel) = self.viewModel.getBelowPageData() let (catalogModel, pageModel) = self.viewModel.getBelowPageData()

View File

@ -212,7 +212,9 @@ extension NRNovelReaderViewController {
await self.viewModel.requestChapterData(currentCatalogModel) await self.viewModel.requestChapterData(currentCatalogModel)
// //
self.viewModel.checkCurrentIndexPath() self.viewModel.checkCurrentIndexPath(haveText: true)
self.reloadData() self.reloadData()
NRHud.dismiss() NRHud.dismiss()

View File

@ -81,7 +81,7 @@ extension NRNovelReadViewModel {
$0.parserAllData() $0.parserAllData()
} }
self.checkCurrentIndexPath() self.checkCurrentIndexPath(haveText: true)
if let vc = self.vc?.getCurrentReadController() { if let vc = self.vc?.getCurrentReadController() {
self.vc?.setViewController(displayController: vc, isAbove: false, animated: false, dismissMenu: dismissMenu) self.vc?.setViewController(displayController: vc, isAbove: false, animated: false, dismissMenu: dismissMenu)
@ -90,7 +90,7 @@ extension NRNovelReadViewModel {
/// ///
/// ///
func checkCurrentIndexPath() { func checkCurrentIndexPath(haveText: Bool = false) {
var currentRow = self.currentPageIndexPath.row var currentRow = self.currentPageIndexPath.row
var currentSection = self.currentPageIndexPath.section var currentSection = self.currentPageIndexPath.section
@ -104,6 +104,13 @@ extension NRNovelReadViewModel {
if listCount <= currentRow, listCount > 0 { if listCount <= currentRow, listCount > 0 {
currentRow = listCount - 1 currentRow = listCount - 1
} }
if haveText {
let currentPage = catalogModel.chapterModel?.pageList?[currentRow]
if currentPage?.pageType != .textPart {
currentRow = currentRow - 1
}
}
self.currentPageIndexPath = IndexPath(row: currentRow, section: currentSection) self.currentPageIndexPath = IndexPath(row: currentRow, section: currentSection)
} }

View File

@ -185,7 +185,9 @@ class NRNovelReadSetManager: NSObject {
paragraphStyle.alignment = .center paragraphStyle.alignment = .center
return [.font: self.textFont, .paragraphStyle: paragraphStyle] return [.font: self.textFont, .paragraphStyle: paragraphStyle]
} }
} }