修复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

@ -16,6 +16,10 @@ class NRViewController: UIViewController {
var didScrollCallback: ((_ : UIScrollView) -> Void)?
lazy var nr_isEditing = false
private(set) var isViewDidAppear = false
///
private(set) var enteredViewDidAppear = false
lazy var backgroundImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "bg_image_01"))
@ -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)?) {
completer?()

View File

@ -86,7 +86,4 @@ extension NRHomeNovelMustReadTodayView: FSPagerViewDataSource, FSPagerViewDelega
vc.novelId = dataArr[index].id ?? ""
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 page = 1
private var isNeedUpdate = false
lazy var collectionViewLayout: UICollectionViewFlowLayout = {
let itemWidth = (UIScreen.width - 32 - 40) / 3
let itemHeight = 150 / 100 * itemWidth + 68
@ -49,17 +51,34 @@ class NRMyListNovelViewController: NRViewController {
return collectionView
}()
@MainActor deinit {
NotificationCenter.default.removeObserver(self)
}
override func viewDidLoad() {
super.viewDidLoad()
self.backgroundImageView.isHidden = true
self.view.backgroundColor = .clear
NotificationCenter.default.addObserver(self, selector: #selector(updateCollectStateNotification), name: NRNovelAPI.updateCollectStateNotification, object: nil)
nr_setupUI()
Task {
await requestDataArr(page: 1)
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if isNeedUpdate {
Task {
await requestDataArr(page: 1)
}
}
}
override func handleHeaderRefresh(_ completer: (() -> Void)?) {
Task {
await requestDataArr(page: 1)
@ -73,6 +92,12 @@ class NRMyListNovelViewController: NRViewController {
self.collectionView.nr_endFooterRefreshing()
}
}
@objc private func updateCollectStateNotification() {
if !isViewDidAppear {
isNeedUpdate = true
}
}
}

View File

@ -20,6 +20,14 @@ class NRMyListViewController: NRViewController {
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 = {
let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in
guard let self = self else { return }
@ -53,10 +61,16 @@ class NRMyListViewController: NRViewController {
extension NRMyListViewController {
private func nr_setupUI() {
view.addSubview(titleLabel)
view.addSubview(editButton)
addChild(novelVC)
view.addSubview(novelVC.view)
titleLabel.snp.makeConstraints { make in
make.centerY.equalTo(editButton)
make.left.equalToSuperview().offset(16)
}
editButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-6)
make.top.equalToSuperview().offset(UIScreen.safeTop)

View File

@ -73,7 +73,7 @@ class NRReadChapterModel: NSObject, SmartCodable {
///
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()
pageModel.content = fullContent

View File

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

View File

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

View File

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

View File

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

View File

@ -84,7 +84,12 @@ class NRNovelReadBottomView: UIView {
lazy var nextButton: UIButton = {
let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in
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.setTitle("Next".localized, for: .normal)

View File

@ -9,6 +9,7 @@ import UIKit
import HWPanModal
import SnapKit
import Cosmos
import YYCategories
class NRNovelReadGradeView: NRPanModalContentView {
@ -37,6 +38,28 @@ class NRNovelReadGradeView: NRPanModalContentView {
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 = {
let label = UILabel()
label.font = .font(ofSize: 14, weight: .medium)
@ -44,6 +67,13 @@ class NRNovelReadGradeView: NRPanModalContentView {
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 = {
let view = NRStarGradeView()
return view
@ -130,7 +160,9 @@ class NRNovelReadGradeView: NRPanModalContentView {
extension NRNovelReadGradeView {
private func nr_setupUI() {
addSubview(coverImageView)
addSubview(nameLabel)
addSubview(moreButton)
moreButton.addSubview(nameLabel)
moreButton.addSubview(indicatorImageView)
addSubview(starView)
addSubview(categoryView)
addSubview(gradeView)
@ -142,10 +174,22 @@ extension NRNovelReadGradeView {
make.height.equalTo(90)
}
nameLabel.snp.makeConstraints { make in
moreButton.snp.makeConstraints { make in
make.top.equalTo(coverImageView).offset(8)
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

View File

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

View File

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

View File

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

View File

@ -23,7 +23,6 @@ class NRNovelDetailViewController: NRViewController {
private var navigationStyleScale: CGFloat = 0
private lazy var isViewDidAppear = false
lazy var coverBgImageView: NRImageView = {
let imageView = NRImageView()
@ -70,6 +69,7 @@ class NRNovelDetailViewController: NRViewController {
@MainActor deinit {
recommandListView.removeObserver(self, forKeyPath: "contentSize")
NotificationCenter.default.removeObserver(self)
}
override func viewDidLoad() {
@ -77,6 +77,8 @@ class NRNovelDetailViewController: NRViewController {
self.edgesForExtendedLayout = [.top]
self.view.backgroundColor = .white
NotificationCenter.default.addObserver(self, selector: #selector(updateCollectStateNotification), name: NRNovelAPI.updateCollectStateNotification, object: nil)
recommandListView.addObserver(self, forKeyPath: "contentSize", context: nil)
nr_setupUI()
@ -98,15 +100,13 @@ class NRNovelDetailViewController: NRViewController {
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !isViewDidAppear {
isViewDidAppear = true
} else {
if enteredViewDidAppear {
Task {
await updateData()
}
}
super.viewDidAppear(animated)
}
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 {
private func updateData() async {
private func updateDetail() async {
await self.viewModel.requestDetailData()
self.coverBgImageView.nr_setImage(self.viewModel.novelModel?.image_url)
self.headerView.model = self.viewModel.novelModel
}
private func updateData() async {
await self.updateDetail()
await self.viewModel.requestRecommandData()
self.recommandVC.dataArr = self.viewModel.recommandDataArr ?? []
}
}

View File

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

View File

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

View File

@ -81,7 +81,7 @@ extension NRNovelReadViewModel {
$0.parserAllData()
}
self.checkCurrentIndexPath()
self.checkCurrentIndexPath(haveText: true)
if let vc = self.vc?.getCurrentReadController() {
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 currentSection = self.currentPageIndexPath.section
@ -104,6 +104,13 @@ extension NRNovelReadViewModel {
if listCount <= currentRow, listCount > 0 {
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)
}

View File

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