You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
905 lines
37 KiB
905 lines
37 KiB
// |
|
// 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 ()<UITableViewDelegate, UITableViewDataSource |
|
#if TF_Enable_Third_Party_Ad |
|
,BUBannerAdViewDelegate> |
|
#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<UIViewController *> *t_arr = self.navigationController.viewControllers; |
|
NSMutableArray<UIViewController *> *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
|
|
|