// // TFNovelDetailViewController.m // TFReader // // Created by 谢腾飞 on 2020/12/19. // Copyright © 2020 xtfei_2011@126.com. All rights reserved. // #import "TFNovelDetailViewController.h" #import "TFCommentsViewController.h" #import "TFTaskViewController.h" #import "TFNovelCatalogueBookmarkController.h" #import "TFNovelDetailHeaderView.h" #import "TFBookStoreNovelStyleOneCell.h" #import "TFBookStoreNovelStyleTwoCell.h" #import "TFBookStoreNovelStyleThreeCell.h" #import "TFBookStoreNovelStyleFourCell.h" #import "TFCommentsViewCell.h" #import "TFPublicAdvertisementViewCell.h" #import "TFReadNovelViewController.h" #import "TFCollectionManager.h" #import "TFReadRecordManager.h" #import "WXYZ_BookDownloadManager.h" #import "TFReaderBookManager.h" #import "TFNovelDetailModel.h" #import "TFReaderSettingHelper.h" #import "TFCatalogModel.h" #import "TFShareManager.h" #import "AppDelegate.h" #import "TFNovelDownloadMenuView.h" #import "TFDownloadCacheViewController.h" #import "WXYZ_BookAiPlayPageViewController.h" @interface TFNovelDetailViewController () #else > #endif @property (nonatomic ,strong) TFNovelDetailModel *bookDetailModel; @property (nonatomic ,strong) UIView *commentSectionView; @property (nonatomic ,strong) UIButton *sectionBottomCommentButton; @property (nonatomic ,weak) UIButton *shareButton; @property (nonatomic ,strong) UIButton *readBookButton; @property (nonatomic ,weak) UIButton *addBookRack; @property (nonatomic ,weak) UIButton *downloadButton; @property (nonatomic ,strong) NSArray *sectionTagArray; @property (nonatomic ,assign) BOOL needRefresh; @end @implementation TFNovelDetailViewController - (void)viewDidLoad { [super viewDidLoad]; [self initialize]; [self createSubviews]; [self netRequest]; } - (void)initialize { self.needRefresh = YES; [self hiddenSeparator]; [self setStatusBarLightContentStyle]; self.navigationBar.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0]; self.navigationBar.navTitleLabel.textColor = kBlackColor; self.navigationBar.navTitleLabel.alpha = 0.0; [self.navigationBar setLightLeftButton]; #if TF_Enable_Ai [WXYZ_BookAiPlayPageViewController sharedManager]; #endif } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self changeNavBarColorState:self.mainTableViewGroup.contentOffset.y withAnimate:NO]; [[NSNotificationCenter defaultCenter] postNotificationName:Notification_Hidden_Tabbar object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushToDownload) name:Notification_Push_To_Download object:nil]; if (self.addBookRack) { if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeNovel] isCollectedWithProductionModel:self.bookDetailModel.bookModel]) { self.addBookRack.enabled = NO; [self.addBookRack setTitle:TFLocalizedString(@"已加入书架") forState:UIControlStateNormal]; [self.addBookRack setTitleColor:kMainColorAlpha(0.5) forState:UIControlStateNormal]; self.addBookRack.userInteractionEnabled = NO; } else { self.addBookRack.enabled = YES; [self.addBookRack setTitle:TFLocalizedString(@"加入书架") forState:UIControlStateNormal]; [self.addBookRack setTitleColor:kMainColor forState:UIControlStateNormal]; [self.addBookRack addTarget:self action:@selector(addBookRackClick:) forControlEvents:UIControlEventTouchUpInside]; self.addBookRack.userInteractionEnabled = YES; } if ([[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeNovel] productionHasReadedWithProduction_id:self.bookDetailModel.bookModel.production_id]) { [self.readBookButton setTitle:TFLocalizedString(@"继续阅读") forState:UIControlStateNormal]; } else { [self.readBookButton setTitle:TFLocalizedString(@"开始阅读") forState:UIControlStateNormal]; } } } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:Notification_Reload_BookDetail object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:Notification_Push_To_Download object:nil]; } - (void)createSubviews { UIButton *shareButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.shareButton = shareButton; shareButton.hidden = YES; shareButton.adjustsImageWhenHighlighted = NO; shareButton.tintColor = kWhiteColor; [shareButton setImage:[[UIImage imageNamed:@"public_share"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal]; [shareButton setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)]; [shareButton addTarget:self action:@selector(UMShareClick) forControlEvents:UIControlEventTouchUpInside]; [self.navigationBar addSubview:shareButton]; [shareButton mas_makeConstraints:^(MASConstraintMaker *make) { make.right.mas_equalTo(self.navigationBar.mas_right).with.offset(- kHalfMargin); make.bottom.mas_equalTo(self.navigationBar.mas_bottom).with.offset(- 7); make.width.height.mas_equalTo(30); }]; #if TF_Download_Mode if ([TFUtilsHelper getAiReadSwitchState]) { UIButton *downloadButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.downloadButton = downloadButton; downloadButton.hidden = YES; downloadButton.adjustsImageWhenHighlighted = NO; downloadButton.tintColor = kWhiteColor; [downloadButton setImage:[[UIImage imageNamed:@"public_download"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal]; [downloadButton setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 5.5, 5.5)]; [downloadButton addTarget:self action:@selector(downloadClick) forControlEvents:UIControlEventTouchUpInside]; [self.navigationBar addSubview:downloadButton]; [downloadButton mas_makeConstraints:^(MASConstraintMaker *make) { make.right.mas_equalTo(shareButton.mas_left).with.offset(- kHalfMargin); make.bottom.mas_equalTo(self.navigationBar.mas_bottom).with.offset(- 7); make.width.height.mas_equalTo(30); }]; } #endif self.mainTableViewGroup.delegate = self; self.mainTableViewGroup.dataSource = self; [self.view addSubview:self.mainTableViewGroup]; [self.mainTableViewGroup mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(0); make.top.mas_equalTo(0); make.width.mas_equalTo(self.view.mas_width); make.height.mas_equalTo(self.view.mas_height); }]; WS(weakSelf) self.mainTableViewGroup.mj_header = [TFRefreshHeader headerWithRefreshingBlock:^{ [weakSelf netRequest]; }]; } - (void)createToolBar { [self.mainTableViewGroup mas_updateConstraints:^(MASConstraintMaker *make) { make.height.mas_equalTo(self.view.mas_height).with.offset(- PUB_TABBAR_HEIGHT); }]; UIView *toolBarView = [[UIView alloc] init]; toolBarView.backgroundColor = kGrayViewColor; [self.view addSubview:toolBarView]; [toolBarView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(0); make.bottom.mas_equalTo(self.view.mas_bottom); make.width.mas_equalTo(self.view.mas_width); make.height.mas_equalTo(PUB_TABBAR_HEIGHT); }]; // 加入书架 UIButton *addBookRack = [UIButton buttonWithType:UIButtonTypeCustom]; self.addBookRack = addBookRack; if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeNovel] isCollectedWithProductionModel:self.bookDetailModel.bookModel]) { self.addBookRack.enabled = NO; [addBookRack setTitle:TFLocalizedString(@"已加入书架") forState:UIControlStateNormal]; [addBookRack setTitleColor:kMainColorAlpha(0.5) forState:UIControlStateNormal]; } else { self.addBookRack.enabled = YES; [addBookRack setTitle:TFLocalizedString(@"加入书架") forState:UIControlStateNormal]; [addBookRack setTitleColor:kMainColor forState:UIControlStateNormal]; [addBookRack addTarget:self action:@selector(addBookRackClick:) forControlEvents:UIControlEventTouchUpInside]; } addBookRack.backgroundColor = kGrayViewColor; [addBookRack.titleLabel setFont:kMainFont]; [addBookRack addBorderLineWithBorderWidth:0.5 borderColor:kGrayViewColor cornerRadius:0 borderType:UIBorderSideTypeRight]; [toolBarView addSubview:addBookRack]; // 开始阅读 self.readBookButton = [UIButton buttonWithType:UIButtonTypeCustom]; if ([[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeNovel] productionHasReadedWithProduction_id:self.bookDetailModel.bookModel.production_id]) { [self.readBookButton setTitle:TFLocalizedString(@"继续阅读") forState:UIControlStateNormal]; } else { [self.readBookButton setTitle:TFLocalizedString(@"开始阅读") forState:UIControlStateNormal]; } self.readBookButton.backgroundColor = kMainColor; [self.readBookButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [self.readBookButton.titleLabel setFont:[UIFont boldSystemFontOfSize:kFontSize13]]; [self.readBookButton addTarget:self action:@selector(readBookClick) forControlEvents:UIControlEventTouchUpInside]; [toolBarView addSubview:self.readBookButton]; // 听书 UIButton *audioButton = [UIButton buttonWithType:UIButtonTypeCustom]; audioButton.backgroundColor = kGrayViewColor; [audioButton setTitleColor:kMainColor forState:UIControlStateNormal]; [audioButton.titleLabel setFont:kMainFont]; [audioButton addTarget:self action:@selector(audioButtonClick:) forControlEvents:UIControlEventTouchUpInside]; #if TF_Enable_Ai if ([TFUtilsHelper getAiReadSwitchState]) { [audioButton setTitle:TFLocalizedString(@"听书详情") forState:UIControlStateNormal]; } else { [audioButton setTitle:TFLocalizedString(@"下载书籍") forState:UIControlStateNormal]; } #else [audioButton setTitle:TFLocalizedString(@"下载书籍") forState:UIControlStateNormal]; #endif [toolBarView addSubview:audioButton]; NSArray *viewArray = @[audioButton, self.readBookButton, addBookRack]; [viewArray mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:0 leadSpacing:0 tailSpacing:0]; [viewArray mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(0); make.height.mas_equalTo(toolBarView.mas_height).with.offset(- PUB_TABBAR_OFFSET); }]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { NSMutableArray *t_sectionTagArray = [NSMutableArray array]; // 简介 // if (self.bookDetailModel.bookModel.production_descirption.length > 0) { [t_sectionTagArray addObject:@"descirption"]; // } // 广告 if (self.bookDetailModel.advert.ad_type != 0) { [t_sectionTagArray addObject:@"ad"]; } // 评论 #if TF_Comments_Mode [t_sectionTagArray addObject:@"comment"]; #endif // 猜你喜欢 if (self.bookDetailModel.label.firstObject.list.count > 0) { [t_sectionTagArray addObject:@"label"]; } if (t_sectionTagArray.count == 0 || t_sectionTagArray.count == 1) { [t_sectionTagArray addObject:@"descirption"]; } self.sectionTagArray = [t_sectionTagArray copy]; return t_sectionTagArray.count; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"descirption"]) { return 1; } if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"ad"]) { return 1; } #if TF_Comments_Mode if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"comment"]) { return self.bookDetailModel.comment.count; } #endif if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"label"]) { return self.bookDetailModel.label.count; } return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if ([[self.sectionTagArray objectAtIndex:indexPath.section] isEqualToString:@"descirption"]) { return [self createHeaderViewCellWithTableView:tableView indexPath:indexPath]; } if ([[self.sectionTagArray objectAtIndex:indexPath.section] isEqualToString:@"ad"]) { return [self createAdCellWithTableView:tableView indexPath:indexPath]; } #if TF_Comments_Mode if ([[self.sectionTagArray objectAtIndex:indexPath.section] isEqualToString:@"comment"]) { return [self createCommentCellWithTableView:tableView indexPath:indexPath]; } #endif if ([[self.sectionTagArray objectAtIndex:indexPath.section] isEqualToString:@"label"]) { return [self createCellWithTabelView:tableView indexPath:indexPath]; } return [[UITableViewCell alloc] init]; } - (UITableViewCell *)createHeaderViewCellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath { WS(weakSelf) static NSString *cellName = @"TFNovelDetailHeaderView"; TFNovelDetailHeaderView *cell = [tableView dequeueReusableCellWithIdentifier:cellName]; if (!cell) { cell = [[TFNovelDetailHeaderView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellName]; } cell.bookModel = self.bookDetailModel.bookModel; cell.catalogueButtonClickBlock = ^{ if (!weakSelf.bookDetailModel.bookModel) return; TFNovelCatalogueBookmarkController *vc = [[TFNovelCatalogueBookmarkController alloc] init]; vc.isReader = weakSelf.isReader; vc.bookModel = weakSelf.bookDetailModel.bookModel; vc.isBookDetailPush = YES; [weakSelf.navigationController pushViewController:vc animated:YES]; }; return cell; } - (UITableViewCell *)createCellWithTabelView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath { TFBookStoreLabelModel *labelModel = [self.bookDetailModel.label objectOrNilAtIndex:indexPath.row]; Class cellClass = TFBookStoreNovelStyleOneCell.class; switch (labelModel.style) { case 1: cellClass = TFBookStoreNovelStyleOneCell.class; break; case 2: cellClass = TFBookStoreNovelStyleTwoCell.class; break; case 3: cellClass = TFBookStoreNovelStyleThreeCell.class; break; case 4: cellClass = TFBookStoreNovelStyleFourCell.class; break; default: cellClass = TFBookStoreNovelStyleOneCell.class; break; } WS(weakSelf) TFBookStoreNovelBasicViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(cellClass)]; if (!cell) { cell = [[cellClass alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass(cellClass)]; } cell.labelModel = labelModel; cell.cellDidSelectItemBlock = ^(NSInteger production_id) { TFNovelDetailViewController *vc = [[TFNovelDetailViewController alloc] init]; vc.book_id = production_id; [weakSelf.navigationController pushViewController:vc animated:YES]; }; return cell; } - (UITableViewCell *)createCommentCellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath { static NSString *cellName = @"TFCommentsViewCell"; TFCommentsViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName]; if (!cell) { cell = [[TFCommentsViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellName]; } cell.commentModel = [self.bookDetailModel.comment objectOrNilAtIndex:indexPath.row]; cell.hiddenEndLine = NO; [cell setIsPreview:YES lastRow:(self.bookDetailModel.comment.count - 1 == indexPath.row)]; return cell; } - (UITableViewCell *)createAdCellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath { static NSString *cellName = @"TFPublicAdvertisementViewCell"; TFPublicAdvertisementViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName]; if (!cell) { cell = [[TFPublicAdvertisementViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellName]; } [cell setAdModel:self.bookDetailModel.advert refresh:self.needRefresh]; cell.mainTableView = tableView; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { #if TF_Comments_Mode if ([[self.sectionTagArray objectAtIndex:indexPath.section] isEqualToString:@"comment"]) { TFCommentsListModel *t_model = [self.bookDetailModel.comment objectOrNilAtIndex:indexPath.row]; [self commentWithComment_id:t_model.comment_id]; } #endif } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { #if TF_Comments_Mode if (!self.bookDetailModel) { return CGFLOAT_MIN; } if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"comment"]) { return 54; } #endif return CGFLOAT_MIN; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { #if TF_Comments_Mode if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"comment"]) { return self.commentSectionView; } #endif UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 10)]; view.backgroundColor = [UIColor clearColor]; return view; } - (UIView *)commentSectionView { if (!_commentSectionView) { _commentSectionView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 54)]; _commentSectionView.backgroundColor = [UIColor whiteColor]; if (self.bookDetailModel.advert.ad_type == 0) { UIView *grayLine = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 10)]; grayLine.backgroundColor = kGrayViewColor; [_commentSectionView addSubview:grayLine]; } UIImageView *mainTitleHoldView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"book_label_hold"]]; [_commentSectionView addSubview:mainTitleHoldView]; [mainTitleHoldView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(kHalfMargin); make.centerY.mas_equalTo(_commentSectionView.mas_centerY).with.offset(5); make.width.height.mas_equalTo(kHalfMargin + kQuarterMargin); }]; UILabel *t_title = [[UILabel alloc] init]; t_title.textAlignment = NSTextAlignmentLeft; t_title.textColor = kBlackColor; t_title.backgroundColor = [UIColor whiteColor]; t_title.font = kBoldFont16; t_title.text = TFLocalizedString(@"最新书评"); [t_title addBorderLineWithBorderWidth:0.5 borderColor:kGrayLineColor cornerRadius:0 borderType:UIBorderSideTypeBottom]; [_commentSectionView addSubview:t_title]; [t_title mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(_commentSectionView).offset(kMargin + kHalfMargin); make.top.equalTo(_commentSectionView).offset(kHalfMargin); make.height.mas_equalTo(44.0); }]; UIButton *commentButton = [UIButton buttonWithType:UIButtonTypeCustom]; commentButton.backgroundColor = [UIColor whiteColor]; [commentButton setTitle:TFLocalizedString(@"写评论") forState:UIControlStateNormal]; [commentButton setTitleColor:kMainColor forState:UIControlStateNormal]; [commentButton.titleLabel setFont:kFont12]; [commentButton addTarget:self action:@selector(commentClick) forControlEvents:UIControlEventTouchUpInside]; [_commentSectionView addSubview:commentButton]; [commentButton mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(t_title.mas_right).offset(kHalfMargin); make.right.equalTo(_commentSectionView).offset(-kHalfMargin); make.centerY.equalTo(t_title); make.height.mas_equalTo(40.0); }]; } return _commentSectionView; } - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { #if TF_Comments_Mode if (!self.bookDetailModel) { return CGFLOAT_MIN; } if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"comment"]) { return 50; } #endif return CGFLOAT_MIN; } - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 50)]; view.backgroundColor = kWhiteColor; #if TF_Comments_Mode if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"comment"]) { if (self.bookDetailModel) { if (self.bookDetailModel.bookModel.total_comment == 0) { [self.sectionBottomCommentButton setTitle:TFLocalizedString(@"暂无评论,点击抢沙发") forState:UIControlStateNormal]; } else { [self.sectionBottomCommentButton setTitle:[NSString stringWithFormat:@"%@(%@%@)", TFLocalizedString(@"查看全部评论"), [TFUtilsHelper formatStringWithInteger:self.bookDetailModel.bookModel.total_comment], TFLocalizedString(@"条")] forState:UIControlStateNormal]; } [view addSubview:self.sectionBottomCommentButton]; } } #endif return view; } - (UIButton *)sectionBottomCommentButton { if (!_sectionBottomCommentButton) { _sectionBottomCommentButton = [UIButton buttonWithType:UIButtonTypeCustom]; _sectionBottomCommentButton.frame = CGRectMake(SCREEN_WIDTH / 4, kHalfMargin, SCREEN_WIDTH / 2 + kMargin, 36); _sectionBottomCommentButton.backgroundColor = [UIColor whiteColor]; _sectionBottomCommentButton.layer.cornerRadius = 18; _sectionBottomCommentButton.layer.borderColor = kMainColor.CGColor; _sectionBottomCommentButton.layer.borderWidth = 0.4f; [_sectionBottomCommentButton setTitleColor:kMainColor forState:UIControlStateNormal]; [_sectionBottomCommentButton.titleLabel setFont:kFont12]; [_sectionBottomCommentButton addTarget:self action:@selector(commentClick) forControlEvents:UIControlEventTouchUpInside]; } return _sectionBottomCommentButton; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat pointY = scrollView.contentOffset.y; [self changeNavBarColorState:pointY withAnimate:YES]; } - (void)pushToDownload { #if TF_Download_Mode TFDownloadCacheViewController *vc = [[TFDownloadCacheViewController alloc] init]; vc.onlyBookMode = YES; [self.navigationController pushViewController:vc animated:YES]; #endif } - (void)commentClick { [self commentWithComment_id:0]; } - (void)commentWithComment_id:(NSInteger)comment_id { WS(weakSelf) TFCommentsViewController *vc = [[TFCommentsViewController alloc] init]; vc.production_id = self.book_id; vc.comment_id = comment_id; vc.productionType = TFProductionTypeNovel; vc.commentsSuccessBlock = ^(TFCommentsListModel *commentModel) { TFNovelDetailModel *t_model = weakSelf.bookDetailModel; // 评论数++ t_model.bookModel.total_comment ++; // 评论数组model添加 NSMutableArray *t_array = [NSMutableArray arrayWithArray:t_model.comment]; [t_array insertObject:commentModel atIndex:0]; t_model.comment = [t_array copy]; weakSelf.bookDetailModel = t_model; [weakSelf.mainTableViewGroup reloadData]; }; [self.navigationController pushViewController:vc animated:YES]; } - (void)audioButtonClick:(UIButton *)sender { if ([TFNetworkManager networkingStatus] == NO) { [TFPromptManager showPromptViewWithStatus:TFPromptStatusSuccess promptTitle:TFLocalizedString(@"听书功能仅支持在线使用")]; return; } if (self.bookDetailModel.bookModel.chapter_list.count == 0) { sender.enabled = NO; [sender setTitleColor:kGrayViewColor forState:UIControlStateNormal]; UIActivityIndicatorView *indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; indicatorView.frame = CGRectMake(0, 0, 30, 30); indicatorView.center = sender.center; [indicatorView startAnimating]; [sender addSubview:indicatorView]; WS(weakSelf) [TFNetworkTools POST:Book_Catalog parameters:@{@"book_id" : [TFUtilsHelper formatStringWithInteger:self.book_id]} model:TFProductionModel.class success:^(BOOL isSuccess, TFProductionModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) { sender.enabled = YES; [indicatorView removeFromSuperview]; [sender setTitleColor:kMainColor forState:UIControlStateNormal]; if (isSuccess) { weakSelf.bookDetailModel.bookModel.chapter_list = t_model.chapter_list; [weakSelf saveCatalog:requestModel.data]; if (t_model.chapter_list.count > 0) { [weakSelf audioButtonClick:sender]; } else { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"书籍获取失败")]; } } else { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:requestModel.msg ?: TFLocalizedString(@"书籍获取失败")]; } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { sender.enabled = YES; [indicatorView removeFromSuperview]; [sender setTitleColor:kMainColor forState:UIControlStateNormal]; [TFPromptManager showPromptWithError:error defaultText:TFLocalizedString(@"书籍获取失败")]; }]; return; } #if TF_Enable_Ai if ([TFUtilsHelper getAiReadSwitchState]) { [[NSNotificationCenter defaultCenter] postNotificationName:Notification_Reset_Player_Inof object:nil]; WXYZ_BookAiPlayPageViewController *vc = [WXYZ_BookAiPlayPageViewController sharedManager]; [vc loadDataWithBookModel:self.bookDetailModel.bookModel chapterModel:nil]; for (UIViewController *vc in self.navigationController.viewControllers) { if ([vc isKindOfClass:[WXYZ_BookAiPlayPageViewController class]]) { [self popViewController]; return; } } TFNavigationController *nav = [[TFNavigationController alloc] initWithRootViewController:vc]; [[TFViewHelper getWindowRootController] presentViewController:nav animated:YES completion:nil]; } #endif #if TF_Download_Mode if (![TFUtilsHelper getAiReadSwitchState]) { [self downloadClick]; } #endif } - (void)downloadClick { if (!self.book_id) { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"书籍获取失败")]; return; } if (self.bookDetailModel.bookModel.list.count == 0) { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"书籍获取失败")]; return; } self.downloadButton.enabled = NO; TFNovelDownloadMenuView *downloadBar = [[TFNovelDownloadMenuView alloc] init]; downloadBar.book_id = [TFUtilsHelper formatStringWithInteger:self.book_id]; downloadBar.chapter_id = [TFUtilsHelper formatStringWithInteger:[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeNovel] getReadingRecordChapter_idWithProduction_id:self.book_id]]; WS(weakSelf) downloadBar.menuBarDidHiddenBlock = ^{ weakSelf.downloadButton.enabled = YES; }; [kMainWindow addSubview:downloadBar]; [downloadBar showDownloadPayView]; } - (void)UMShareClick { [TFShareManager shareWithProduction_id:NSStringFromInteger(self.bookDetailModel.bookModel.production_id) chapter_id:nil type:TFShareTypeBook]; } - (void)addBookRackClick:(UIButton *)sender { [TFUtilsHelper synchronizationRackProductionWithProduction_id:self.book_id productionType:TFProductionTypeNovel complete:nil]; if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeNovel] addCollectionWithProductionModel:self.bookDetailModel.bookModel atIndex:0]) { [TFPromptManager showPromptViewWithStatus:TFPromptStatusSuccess promptTitle:TFLocalizedString(@"已加入书架")]; [sender setTitle:TFLocalizedString(@"已加入书架") forState:UIControlStateNormal]; [sender setTitleColor:kMainColorAlpha(0.5) forState:UIControlStateNormal]; sender.enabled = NO; } else { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"添加失败")]; } } - (void)readBookClick { if (self.isReader) { [self.navigationController popViewControllerAnimated:YES]; return; } if (!self.bookDetailModel.bookModel) { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"书籍获取失败")]; return; } [TFTaskViewController taskReadRequestWithProduction_id:self.book_id]; // 删除多余的阅读器和书籍详情页 NSArray *t_arr = self.navigationController.viewControllers; NSMutableArray *tt_arr = [t_arr mutableCopy]; for (UIViewController *obj in t_arr) { if ([obj isKindOfClass:TFReadNovelViewController.class] || ([obj isKindOfClass:TFNovelDetailViewController.class] && obj != self)) { [tt_arr removeObject:obj]; } } if (tt_arr.count != self.navigationController.viewControllers.count) { self.navigationController.viewControllers = tt_arr; } TFReadNovelViewController *vc = [[TFReadNovelViewController alloc] init]; vc.book_id = self.book_id; // vc.bookModel = self.bookDetailModel.bookModel; [self.navigationController pushViewController:vc animated:YES]; [[TFCollectionManager shareManagerWithProductionType:TFProductionTypeNovel] moveCollectionToTopWithProductionModel:self.bookDetailModel.bookModel]; } - (void)jumpToReader:(NSNotification *)noti { if ([noti.object isEqualToString:@"TFNovelDetailViewController"]) { TFProductionModel *t_model = [noti.userInfo objectForKey:@"bookModel"]; TFReadNovelViewController *vc = [[TFReadNovelViewController alloc] init]; vc.book_id = t_model.production_id; vc.bookModel = t_model; [self.navigationController pushViewController:vc animated:YES]; } } - (void)netRequest { if ([TFNetworkManager networkingStatus] == NO) { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"当前无网络连接")]; return; } WS(weakSelf) [TFNetworkTools POST:Book_Mall_Detail parameters:@{@"book_id":[TFUtilsHelper formatStringWithInteger:self.book_id]} model:TFNovelDetailModel.class success:^(BOOL isSuccess, TFNovelDetailModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) { if (isSuccess) { weakSelf.bookDetailModel = t_model; [weakSelf createToolBar]; [weakSelf requestCatalog]; } else { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:requestModel.msg ?: TFLocalizedString(@"书籍获取失败")]; } weakSelf.shareButton.hidden = NO; #if TF_Download_Mode weakSelf.downloadButton.hidden = NO; #endif [weakSelf.mainTableViewGroup endRefreshing]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [TFPromptManager showPromptWithError:error defaultText:TFLocalizedString(@"书籍获取失败")]; [weakSelf.mainTableViewGroup endRefreshing]; }]; } // 获取目录信息 - (void)requestCatalog { NSInteger chapter_id = [[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeNovel] getReadingRecordChapter_idWithProduction_id:self.book_id]; NSDictionary *params = @{ @"book_id" : [TFUtilsHelper formatStringWithInteger:self.book_id], @"chapter_id" : @(chapter_id), @"scroll_type": @(1), // 1:向下加载;2:向上加载 }; TFCatalogModel * __block catalogModel = nil; NSDictionary * __block catalogDict = nil; WS(weakSelf) [TFNetworkTools POST:Book_New_Catalog parameters:params model:TFCatalogModel.class success:^(BOOL isSuccess, TFCatalogModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) { if (isSuccess) { catalogModel = t_model; weakSelf.bookDetailModel.bookModel.list = t_model.list; weakSelf.bookDetailModel.bookModel.author_name = t_model.author.author_name; weakSelf.bookDetailModel.bookModel.author_id = t_model.author.author_id; weakSelf.bookDetailModel.bookModel.author_note = t_model.author.author_note; weakSelf.bookDetailModel.bookModel.author_avatar = t_model.author.author_avatar; // 预下载第一章 if (t_model.list.count > 0) { [[TFReaderBookManager sharedManager] downloadPrestrainChapterWithProductionModel:weakSelf.bookDetailModel.bookModel production_id:weakSelf.book_id chapter_id:[[t_model.list firstObject].chapter_id integerValue] completionHandler:nil]; } if (catalogDict) { NSString *str = [t_model.author modelToJSONString]; NSDictionary *t_dict = [TFUtilsHelper dictionaryWithJsonString:str]; NSMutableDictionary *tt_dict = [NSMutableDictionary dictionaryWithDictionary:catalogDict]; [tt_dict setObject:t_dict forKey:@"author"]; [weakSelf saveCatalog:tt_dict]; } } else { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:requestModel.msg ?: TFLocalizedString(@"书籍获取失败")]; } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [TFPromptManager showPromptWithError:error defaultText:TFLocalizedString(@"书籍获取失败")]; }]; [TFNetworkTools POST:Book_Catalog parameters:@{@"book_id" : [TFUtilsHelper formatStringWithInteger:self.book_id]} model:TFProductionModel.class success:^(BOOL isSuccess, TFProductionModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) { if (isSuccess) { weakSelf.bookDetailModel.bookModel.chapter_list = t_model.chapter_list; if (catalogModel) { NSString *str = [catalogModel.author modelToJSONString]; NSDictionary *t_dict = [TFUtilsHelper dictionaryWithJsonString:str]; NSMutableDictionary *tt_dict = [NSMutableDictionary dictionaryWithDictionary:requestModel.data]; [tt_dict setObject:t_dict forKey:@"author"]; [weakSelf saveCatalog:tt_dict]; } else { catalogDict = requestModel.data; } } } failure:nil]; } - (void)setBookDetailModel:(TFNovelDetailModel *)bookDetailModel { _bookDetailModel = bookDetailModel; [self.navigationBar setNavigationBarTitle:bookDetailModel.bookModel.name?:@""]; self.needRefresh = YES; [self.mainTableViewGroup reloadData]; dispatch_async(dispatch_get_main_queue(), ^{ self.needRefresh = NO; }); } - (void)changeNavBarColorState:(CGFloat)contentOffsetY withAnimate:(BOOL)animate { CGFloat alpha = [TFColorHelper getAlphaWithContentOffsetY:contentOffsetY]; CGFloat rbgColor = [TFColorHelper getColorWithContentOffsetY:contentOffsetY]; self.navigationBar.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:alpha]; self.navigationBar.navTitleLabel.backgroundColor = [UIColor clearColor]; self.navigationBar.navTitleLabel.alpha = alpha; self.navigationBar.navTitleLabel.textColor = kColorRGBA(rbgColor, rbgColor, rbgColor, 1); [self.navigationBar setLeftButtonTintColor:kColorRGBA(rbgColor, rbgColor, rbgColor, 1)]; self.shareButton.tintColor = kColorRGBA(rbgColor, rbgColor, rbgColor, 1); #if TF_Download_Mode self.downloadButton.tintColor = kColorRGBA(rbgColor, rbgColor, rbgColor, 1); #endif if (contentOffsetY > 60) { [self setStatusBarDefaultStyle]; } else { [self setStatusBarLightContentStyle]; } } /// 保存目录列表到本地 - (void)saveCatalog:(NSDictionary *)catalog { NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; path = [path stringByAppendingPathComponent:[TFUtilsHelper stringToMD5:@"book_catalog"]]; if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:@{} error:nil]; } NSString *catalogName = [NSString stringWithFormat:@"%zd_%@", self.book_id, @"catalog"]; NSString *fullPath = [path stringByAppendingFormat:@"/%@.plist", [TFUtilsHelper stringToMD5:catalogName]]; [catalog writeToFile:fullPath atomically:YES]; } @end