修复bug
This commit is contained in:
parent
f9f5b83e20
commit
17d83f3b7a
@ -17,6 +17,10 @@ class NRViewController: UIViewController {
|
||||
|
||||
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"))
|
||||
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)?) {
|
||||
completer?()
|
||||
|
||||
@ -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 效果或者间距来实现类似感观。
|
||||
}
|
||||
|
||||
@ -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)
|
||||
@ -74,6 +93,12 @@ class NRMyListNovelViewController: NRViewController {
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func updateCollectStateNotification() {
|
||||
if !isViewDidAppear {
|
||||
isNeedUpdate = true
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension NRMyListNovelViewController {
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -125,6 +125,7 @@ extension NRNovelDetailMoreLikeCell {
|
||||
|
||||
categoryView.snp.makeConstraints { make in
|
||||
make.left.equalToSuperview()
|
||||
make.right.lessThanOrEqualToSuperview()
|
||||
make.bottom.equalToSuperview()
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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 ?? []
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -212,7 +212,9 @@ extension NRNovelReaderViewController {
|
||||
await self.viewModel.requestChapterData(currentCatalogModel)
|
||||
|
||||
//校验索引,避免越界
|
||||
self.viewModel.checkCurrentIndexPath()
|
||||
self.viewModel.checkCurrentIndexPath(haveText: true)
|
||||
|
||||
|
||||
|
||||
self.reloadData()
|
||||
NRHud.dismiss()
|
||||
|
||||
@ -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)
|
||||
|
||||
}
|
||||
|
||||
@ -185,7 +185,9 @@ class NRNovelReadSetManager: NSObject {
|
||||
paragraphStyle.alignment = .center
|
||||
|
||||
return [.font: self.textFont, .paragraphStyle: paragraphStyle]
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user