小说绘上架版本

This commit is contained in:
xtfei2011
2021-02-07 11:24:08 +08:00
commit ee5c1c8b12
1762 changed files with 115892 additions and 0 deletions
@@ -0,0 +1,19 @@
//
// TFAudioDetailViewController.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface TFAudioDetailViewController : TFBasicViewController
@property (nonatomic ,assign) NSInteger audio_id;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,368 @@
//
// TFAudioDetailViewController.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFAudioDetailViewController.h"
#import "WXYZ_AudioDownloadViewController.h"
#import "TFAudioDetailHeaderView.h"
#import "TFAudioDetailFooterView.h"
#import "WXYZ_CompositeEmbeddedTableView.h"
#import "WXYZ_TouchAssistantView.h"
#import "TFAudioDetailModel.h"
#import "TFShareManager.h"
#import "UIView+BorderLine.h"
@interface TFAudioDetailViewController ()<UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate>
@property (nonatomic ,strong) UIView *gradientColorView;
@property (nonatomic ,assign) BOOL canScroll;
@property (nonatomic ,assign) CGFloat lastContentOffset; // 滑动距离
@property (nonatomic ,assign) BOOL slidingUp; // 滑动方向
@property (nonatomic ,strong) TFAudioDetailModel *detailModel;
@property (nonatomic ,strong) UIButton *shareButton;
@property (nonatomic ,strong) UIButton *downloadButton;
@property (nonatomic ,strong) WXYZ_CompositeEmbeddedTableView *mallTableView;
@property (nonatomic ,strong) TFAudioDetailHeaderView *headerView;
@property (nonatomic ,strong) TFAudioDetailFooterView *footerView;
@property (nonatomic ,assign) CGFloat headerViewHeight;
@end
@implementation TFAudioDetailViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self initialize];
[self createSubviews];
[self netRequest];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self setStatusBarLightContentStyle];
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Hidden_Tabbar object:nil];
if (self.headerView) {
[self.headerView reloadCollectionButtonState];
}
}
- (void)initialize
{
[self hiddenSeparator];
self.navigationBar.backgroundColor = [UIColor clearColor];
self.navigationBar.navTitleLabel.alpha = 0;
self.navigationBar.navTitleLabel.textColor = kWhiteColor;
[self.navigationBar setLightLeftButton];
self.canScroll = YES;
self.headerViewHeight = 0;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeScrollStatus:) name:Notification_Audio_Can_Leave_Top object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadAudioDetail:) name:Notification_Audio_Check_Recommend object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netRequest) name:Notification_Recharge_Success object:nil];
}
- (void)createSubviews
{
self.shareButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.shareButton.adjustsImageWhenHighlighted = NO;
self.shareButton.tintColor = kWhiteColor;
self.shareButton.hidden = YES;
[self.shareButton setImage:[[UIImage imageNamed:@"public_share"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal];
[self.shareButton setImageEdgeInsets:UIEdgeInsetsMake(6, 12, 6, 0)];
[self.shareButton addTarget:self action:@selector(shareButtonClick) forControlEvents:UIControlEventTouchUpInside];
[self.navigationBar addSubview:self.shareButton];
[self.shareButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(self.navigationBar.mas_right).with.offset(- kMargin);
make.bottom.mas_equalTo(self.navigationBar.mas_bottom).with.offset(- 7);
make.width.height.mas_equalTo(30);
}];
#if TF_Download_Mode
self.downloadButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.downloadButton.hidden = YES;
self.downloadButton.adjustsImageWhenHighlighted = NO;
self.downloadButton.tintColor = kWhiteColor;
[self.downloadButton setImage:[[UIImage imageNamed:@"public_download"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal];
[self.downloadButton setImageEdgeInsets:UIEdgeInsetsMake(6, 12, 6, 0)];
[self.downloadButton addTarget:self action:@selector(downloadClick) forControlEvents:UIControlEventTouchUpInside];
[self.navigationBar addSubview:self.downloadButton];
[self.downloadButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(self.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.navigationBar.touchEnabled = YES;
self.gradientColorView = [[UIView alloc] init];
self.gradientColorView.backgroundColor = kGrayViewColor;
[self.view addSubview:self.gradientColorView];
[self.gradientColorView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view);
}];
self.mallTableView = [[WXYZ_CompositeEmbeddedTableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) style:UITableViewStylePlain];
self.mallTableView.delegate = self;
self.mallTableView.dataSource = self;
self.mallTableView.bounces = NO;
[self.mallTableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
[self.view addSubview:self.mallTableView];
WS(weakSelf)
self.headerView = [[TFAudioDetailHeaderView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_WIDTH)];
self.headerView.changeIntroductionBlock = ^(CGFloat headerViewHeight, BOOL viewEnable) {
weakSelf.headerViewHeight = headerViewHeight;
weakSelf.mallTableView.scrollEnabled = viewEnable;
// 重置headerView高度
[UIView animateWithDuration:kAnimatedDurationFast animations:^{
UIView *t_headerView = weakSelf.headerView;
t_headerView.height = headerViewHeight;
[weakSelf.mallTableView beginUpdates];
[weakSelf.mallTableView setTableHeaderView:t_headerView];
[weakSelf.mallTableView endUpdates];
}];
};
[self.mallTableView setTableHeaderView:self.headerView];
self.footerView = [[TFAudioDetailFooterView alloc] init];
self.footerView.view.hidden = YES;
self.footerView.view.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
self.footerView.audio_id = self.audio_id;
[self.footerView.view addRoundingCornersWithRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)];
[self.mallTableView setTableFooterView:self.footerView.view];
[self addChildViewController:self.footerView];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [[UITableViewCell alloc] init];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return CGFLOAT_MIN;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return CGFLOAT_MIN;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return CGFLOAT_MIN;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"contentOffset"]) {
CGPoint point = [((NSValue *)[self.mallTableView valueForKey:@"contentOffset"]) CGPointValue];
if (self.canScroll) {
self.footerView.contentOffSetY = point.y;
self.headerView.contentOffSetY = point.y;
} else {
self.footerView.contentOffSetY = self.headerViewHeight - PUB_NAVBAR_HEIGHT;
self.headerView.contentOffSetY = self.headerViewHeight - PUB_NAVBAR_HEIGHT;
}
}
}
- (void)changeScrollStatus:(NSNotification *)noti
{
self.canScroll = [noti.object boolValue];
}
- (void)reloadAudioDetail:(NSNotification *)noti
{
self.audio_id = [noti.object integerValue];
self.footerView.audio_id = self.audio_id;
[self netRequest];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
self.lastContentOffset = scrollView.contentOffset.y; //判断上下滑动时
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y <= self.headerViewHeight - PUB_NAVBAR_HEIGHT) {
if (self.canScroll) {
self.canScroll = YES;
self.footerView.canScroll = NO;
if (scrollView.contentOffset.y <= 0) {
scrollView.contentOffset = CGPointMake(0, 0);
}
} else {
scrollView.contentOffset = CGPointMake(0, self.headerViewHeight - PUB_NAVBAR_HEIGHT);
}
if (scrollView.contentOffset.y < self.lastContentOffset ){
self.slidingUp = NO;
} else if (scrollView.contentOffset.y > self.lastContentOffset ){
self.slidingUp = YES;
}
} else {
self.canScroll = NO;
scrollView.contentOffset = CGPointMake(0, self.headerViewHeight - PUB_NAVBAR_HEIGHT);
self.footerView.canScroll = YES;
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (self.footerView.canScroll || scrollView.contentOffset.y == 0) {
return;
}
if (self.slidingUp) {
if (fabs(scrollView.contentOffset.y - self.lastContentOffset) > self.headerViewHeight * 0.2) {
[scrollView setContentOffset:CGPointMake(0, self.headerViewHeight - PUB_NAVBAR_HEIGHT) animated:YES];
} else {
[scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
}
} else {
if (fabs(scrollView.contentOffset.y - self.lastContentOffset) > self.headerViewHeight * 0.2) {
[scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
} else {
[scrollView setContentOffset:CGPointMake(0, self.headerViewHeight - PUB_NAVBAR_HEIGHT) animated:YES];
}
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
if (self.canScroll) {
if (self.slidingUp) {
if (fabs(scrollView.contentOffset.y - self.lastContentOffset) > self.headerViewHeight * 0.2) {
[scrollView setContentOffset:CGPointMake(0, self.headerViewHeight - PUB_NAVBAR_HEIGHT) animated:YES];
} else {
[scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
}
} else {
if (fabs(scrollView.contentOffset.y - self.lastContentOffset) > self.headerViewHeight * 0.2) {
[scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
} else {
[scrollView setContentOffset:CGPointMake(0, self.headerViewHeight - PUB_NAVBAR_HEIGHT) animated:YES];
}
}
}
}
- (void)shareButtonClick
{
[TFShareManager shareWithProduction_id:NSStringFromInteger(self.detailModel.audio.production_id) chapter_id:nil type:TFShareTypeAudio];
}
- (void)downloadClick
{
if (!self.audio_id || self.audio_id == 0) {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"书籍获取失败")];
return;
}
if (!self.footerView.directoryModel.chapter_list || self.footerView.directoryModel.chapter_list.count == 0) {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"书籍获取失败")];
return;
}
WXYZ_AudioDownloadViewController *vc = [[WXYZ_AudioDownloadViewController alloc] init];
vc.production_id = self.audio_id;
[self.navigationController pushViewController:vc animated:YES];
}
- (void)netRequest
{
if ([TFNetworkManager networkingStatus] == NO) {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"当前无网络连接")];
return;
}
WS(weakSelf)
[TFNetworkTools POST:Audio_Info parameters:@{@"audio_id":[TFUtilsHelper formatStringWithInteger:self.audio_id]} model:nil success:^(BOOL isSuccess, id _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) {
if (isSuccess) {
NSMutableDictionary *t_dic = [t_model mutableCopy];
NSMutableDictionary *t_data_dic = [[t_dic objectForKey:@"data"] mutableCopy];
NSMutableDictionary *t_production_dic = [NSMutableDictionary dictionaryWithDictionary:[t_data_dic objectForKey:@"audio"]];
NSMutableDictionary *t_ad_dic = [NSMutableDictionary dictionaryWithDictionary:[t_data_dic objectForKey:@"advert"]];
[t_production_dic addEntriesFromDictionary:t_ad_dic];
[t_data_dic setObject:t_production_dic forKey:@"audio"];
TFAudioDetailModel *t_model = [TFAudioDetailModel modelWithDictionary:t_data_dic];
weakSelf.headerView.audioModel = t_model.audio;
weakSelf.detailModel = t_model;
if (t_model.color.count > 1) {
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = weakSelf.view.frame;
gradientLayer.colors = @[(__bridge id)[UIColor colorWithHexString:[t_model.color firstObject]?:@""].CGColor,(__bridge id)[UIColor colorWithHexString:[t_model.color objectAtIndex:1]?:@""].CGColor];
gradientLayer.startPoint = CGPointMake(0, 0);
gradientLayer.endPoint = CGPointMake(0, 1.0);
[weakSelf.gradientColorView.layer addSublayer:gradientLayer];
}
}
weakSelf.shareButton.hidden = NO;
weakSelf.downloadButton.hidden = NO;
weakSelf.footerView.view.hidden = NO;
} failure:nil];
[TFNetworkTools POST:Audio_Catalog parameters:@{@"audio_id":[TFUtilsHelper formatStringWithInteger:self.audio_id]} model:TFProductionModel.class success:^(BOOL isSuccess, TFProductionModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) {
if (isSuccess) {
weakSelf.footerView.directoryModel = t_model;
[weakSelf.mallTableView reloadData];
}
} failure:nil];
}
- (void)dealloc
{
@try {
[self.mallTableView removeObserver:self forKeyPath:@"contentOffset" context:NULL];
} @catch (NSException *exception) {
}
}
@end
@@ -0,0 +1,21 @@
//
// TFAudioDirectoryViewController.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface TFAudioDirectoryViewController : TFBasicViewController
@property (nonatomic ,assign) NSInteger audio_id;
@property (nonatomic ,assign) BOOL canScroll;
@property (nonatomic ,strong) TFProductionModel *directoryModel;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,416 @@
//
// TFAudioDirectoryViewController.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFAudioDirectoryViewController.h"
#import "TFAudioPlayViewController.h"
#import "TFTaskViewController.h"
#import "TFAudioDirectoryViewCell.h"
#import "WXYZ_AudioPlayPageMenuView.h"
#import "WXYZ_ChapterBottomPayBar.h"
#import "WXYZ_AudioDownloadManager.h"
#import "TFReadRecordManager.h"
#import "TFCollectionManager.h"
@interface TFAudioDirectoryViewController ()<UITableViewDelegate, UITableViewDataSource>
@property (nonatomic ,strong) UIView *headerSectionView;
@property (nonatomic ,strong) UILabel *headerSectionLabel;
@property (nonatomic ,assign) BOOL toolSelect; // 工具栏状态选择
@end
@implementation TFAudioDirectoryViewController
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.mainTableView reloadData];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self initialize];
[self createSubviews];
}
- (void)initialize
{
[self hiddenNavigationBar:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeChapterList:) name:NSNotification_Auto_Buy_Audio_Chapter object:nil];
}
- (void)createSubviews
{
self.mainTableView.delegate = self;
self.mainTableView.dataSource = self;
self.mainTableView.contentInset = UIEdgeInsetsMake(0, 0, PUB_TABBAR_OFFSET, 0);
[self.view addSubview:self.mainTableView];
[self.mainTableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view);
}];
[self setEmptyOnView:self.mainTableView title:TFLocalizedString(@"暂无目录列表") buttonTitle:@"" tapBlock:^{
}];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (self.toolSelect) {
return;
}
if ([scrollView isEqual:self.mainTableView]) {
if (!self.canScroll) {
scrollView.contentOffset = CGPointZero;
}
if (scrollView.contentOffset.y > 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Audio_Can_Leave_Top object:@NO];
}
}
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
self.toolSelect = NO;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y <= 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Audio_Can_Leave_Top object:@YES];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.directoryModel.chapter_list.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
WS(weakSelf)
TFProductionChapterModel *t_chapterList = [self.directoryModel.chapter_list objectOrNilAtIndex:indexPath.row];
TFAudioDirectoryViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TFAudioDirectoryViewCell"];
if (!cell) {
cell = [[TFAudioDirectoryViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TFAudioDirectoryViewCell"];
}
cell.audioDirectoryModel = t_chapterList;
cell.index = indexPath;
cell.cellDownloadState = [[WXYZ_AudioDownloadManager sharedManager] getChapterDownloadStateWithProduction_id:t_chapterList.production_id chapter_id:t_chapterList.chapter_id];
cell.hiddenEndLine = self.directoryModel.chapter_list.count - 1 == indexPath.row;
cell.downloadChapterBlock = ^(NSInteger audio_id, NSInteger chapter_id, NSIndexPath *cellIndexPath) {
[weakSelf requestChapterDownloadDataWithAudio_id:audio_id chapter_ids:@[[TFUtilsHelper formatStringWithInteger:chapter_id]] indexPath:cellIndexPath];
};
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Reset_Player_Inof object:nil];
WS(weakSelf)
TFProductionChapterModel *t_chapterListModel = [self.directoryModel.chapter_list objectOrNilAtIndex:indexPath.row];
TFAudioPlayViewController *vc = [TFAudioPlayViewController sharedManager];
vc.chapter_list = self.directoryModel.chapter_list;
[vc loadDataWithAudio_id:t_chapterListModel.production_id chapter_id:t_chapterListModel.chapter_id];
for (UIViewController *vc in weakSelf.navigationController.viewControllers) {
if ([vc isKindOfClass:[TFAudioPlayViewController class]]) {
[weakSelf popViewController];
return;
}
}
[weakSelf closeContinuePlayButton];
[TFTaskViewController taskReadRequestWithProduction_id:self.audio_id];
TFNavigationController *nav = [[TFNavigationController alloc] initWithRootViewController:vc];
[[TFViewHelper getWindowRootController] presentViewController:nav animated:YES completion:^{
[weakSelf.mainTableView reloadData];
}];
[[TFCollectionManager shareManagerWithProductionType:TFProductionTypeAudio] moveCollectionToTopWithProductionModel:self.directoryModel];
}
//section头间距
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (self.directoryModel.chapter_list.count > 0) {
return 60;
}
return CGFLOAT_MIN;
}
//section头视图
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
return self.headerSectionView;
}
//section底部间距
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return CGFLOAT_MIN;
}
//section底部视图
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, PUB_TABBAR_OFFSET == 0 ? 10 : PUB_TABBAR_OFFSET)];
view.backgroundColor = [UIColor clearColor];
return view;
}
- (UIView *)headerSectionView
{
if (!_headerSectionView) {
_headerSectionView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 60)];
_headerSectionView.backgroundColor = kWhiteColor;
[_headerSectionView addSubview:self.headerSectionLabel];
if (![[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeAudio]
isCurrentPlayingProductionWithProduction_id:self.audio_id] // 不是正在播放的作品
&&
([[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeAudio]
getReadingRecordChapter_idWithProduction_id:self.audio_id] > 0) // 记录章节id存在
&&
([[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeAudio]
getReadingRecordChapterTitleWithProduction_id:self.audio_id].length > 0) // 记录的章节名称存在
) {
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString: [NSString stringWithFormat:@"%@|%@", TFLocalizedString(@"续播"), [[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeAudio] getReadingRecordChapterTitleWithProduction_id:self.audio_id]]];
CGFloat width = [TFViewHelper getDynamicWidthWithLabelFont:kFont10 labelHeight:30.0 labelText:text.string maxWidth:SCREEN_WIDTH / 2.0];
width += kHalfMargin;
UIButton *continuePlay = [UIButton buttonWithType:UIButtonTypeCustom];
continuePlay.frame = CGRectMake(kMargin, kHalfMargin + 5, 20.0 + kQuarterMargin + width, 30);
continuePlay.tag = 1123;
continuePlay.backgroundColor = kWhiteColor;
continuePlay.layer.cornerRadius = 15;
continuePlay.layer.borderColor = kMainColor.CGColor;
continuePlay.layer.borderWidth = 1;
continuePlay.clipsToBounds = YES;
[continuePlay addTarget:self action:@selector(continueButtonClick) forControlEvents:UIControlEventTouchUpInside];
[_headerSectionView addSubview:continuePlay];
UIImageView *icon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"audio_play"]];
icon.frame = CGRectMake(5, 5, continuePlay.height - 10, continuePlay.height - 10);
[continuePlay addSubview:icon];
text.font = kFont10;
text.color = kMainColor;
[text addAttribute:NSFontAttributeName value:kBoldFont10 range:NSMakeRange(0, 2)];
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(icon.right + 5, 0, width, continuePlay.height)];
title.attributedText = text;
[continuePlay addSubview:title];
UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeCustom];
closeButton.frame = CGRectMake(continuePlay.right - continuePlay.height / 2 + 5, continuePlay.top - 5, continuePlay.height / 2 + 10, continuePlay.height / 2 + 10);
closeButton.layer.cornerRadius = continuePlay.height / 4;
closeButton.clipsToBounds = YES;
closeButton.tag = 1123;
closeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
closeButton.contentHorizontalAlignment = UIControlContentVerticalAlignmentFill;
[closeButton setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 10, 10)];
[closeButton setImage:[UIImage imageNamed:@"audio_continue_close"] forState:UIControlStateNormal];
[closeButton addTarget:self action:@selector(closeContinuePlayButton) forControlEvents:UIControlEventTouchUpInside];
[_headerSectionView addSubview:closeButton];
}
TFButton *selectionButton = [[TFButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - 40 - kHalfMargin, 10, 40, 40) buttonTitle:TFLocalizedString(@"选章标题") buttonImageName:@"audio_selection" buttonIndicator:TFButtonIndicatorTitleBottom];
selectionButton.tag = 0;
selectionButton.buttonTintColor = kBlackColor;
selectionButton.buttonTitleFont = kFont10;
selectionButton.graphicDistance = 2;
selectionButton.buttonImageScale = 0.4;
[selectionButton addTarget:self action:@selector(toolBarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[_headerSectionView addSubview:selectionButton];
TFButton *sortButton = [[TFButton alloc] initWithFrame:CGRectMake(selectionButton.left - 40 - kHalfMargin, selectionButton.top, selectionButton.width, selectionButton.height) buttonTitle:TFLocalizedString(@"排序") buttonImageName:@"audio_order_sequence" buttonIndicator:TFButtonIndicatorTitleBottom];
sortButton.selected = NO;
sortButton.tag = 1;
sortButton.buttonTintColor = kBlackColor;
sortButton.buttonTitleFont = kFont10;
sortButton.graphicDistance = 2;
sortButton.buttonImageScale = 0.4;
[sortButton addTarget:self action:@selector(toolBarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[_headerSectionView addSubview:sortButton];
}
return _headerSectionView;
}
- (UILabel *)headerSectionLabel
{
if (!_headerSectionLabel) {
_headerSectionLabel = [[UILabel alloc] initWithFrame:CGRectMake(kMargin, 0, SCREEN_WIDTH / 2, 60)];
_headerSectionLabel.textColor = kGrayTextDeepColor;
_headerSectionLabel.font = kFont12;
_headerSectionLabel.textAlignment = NSTextAlignmentLeft;
}
return _headerSectionLabel;
}
- (void)setDirectoryModel:(TFProductionModel *)directoryModel
{
_directoryModel = directoryModel;
self.headerSectionLabel.text = [NSString stringWithFormat:TFLocalizedString(@"共%@章"), [TFUtilsHelper formatStringWithInteger:directoryModel.chapter_list.count]];
[self.mainTableView reloadData];
self.emptyView.contentViewY = kHalfMargin;
[self.mainTableView endRefreshing];
[self.mainTableView xtfei_endLoading];
}
- (void)continueButtonClick
{
WS(weakSelf)
TFAudioPlayViewController *vc = [TFAudioPlayViewController sharedManager];
vc.chapter_list = self.directoryModel.chapter_list;
[vc loadDataWithAudio_id:self.audio_id chapter_id:[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeAudio] getReadingRecordChapter_idWithProduction_id:self.audio_id]];
TFNavigationController *nav = [[TFNavigationController alloc] initWithRootViewController:vc];
[[TFViewHelper getWindowRootController] presentViewController:nav animated:YES completion:^{
[weakSelf closeContinuePlayButton];
[weakSelf.mainTableView reloadData];
}];
}
- (void)closeContinuePlayButton
{
[self.headerSectionView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.tag == 1123) {
[obj removeAllSubviews];
[obj removeFromSuperview];
obj = nil;
}
}];
}
- (void)toolBarButtonClick:(TFButton *)sender
{
switch (sender.tag) {
case 0: // 选章
{
WS(weakSelf)
WXYZ_AudioPlayPageMenuView *chooseMenuView = [[WXYZ_AudioPlayPageMenuView alloc] init];
chooseMenuView.menuListArray = self.directoryModel.chapter_list;
chooseMenuView.totalChapter = self.directoryModel.total_chapters;
chooseMenuView.chooseMenuBlock = ^(WXYZ_MenuType menuType, NSInteger chooseIndex) {
/* 滚动指定段的指定row 到 指定位置*/
weakSelf.toolSelect = YES;
[weakSelf.mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:chooseIndex * 30 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
};
[chooseMenuView showWithMenuType:WXYZ_MenuTypeAudioSelection];
}
break;
case 1: // 排序
{
if (sender.selected) {
sender.selected = NO;
sender.buttonImageName = @"audio_order_sequence";
} else {
sender.selected = YES;
sender.buttonImageName = @"audio_orider_reversed";
}
self.directoryModel.chapter_list = [[self.directoryModel.chapter_list reverseObjectEnumerator] allObjects];
[self.mainTableView reloadData];
}
break;
default:
break;
}
}
- (void)changeChapterList:(NSNotification *)noti
{
// 需要改变状态的chapter的is_preview状态
if ([noti.object isKindOfClass:[NSString class]]) {
NSInteger t_chapter_id = [noti.object integerValue];
for (TFProductionChapterModel *t_chapterModel in self.directoryModel.chapter_list) {
if (t_chapter_id == t_chapterModel.chapter_id) {
t_chapterModel.is_preview = 0;
break;
}
}
}
}
- (void)requestChapterDownloadDataWithAudio_id:(NSInteger)audio_id chapter_ids:(NSArray <NSString *>*)chapter_ids indexPath:(NSIndexPath *)indexPath
{
WS(weakSelf)
WXYZ_AudioDownloadManager *audioDownloadManager = [WXYZ_AudioDownloadManager sharedManager];
[audioDownloadManager downloadChaptersWithProductionModel:self.directoryModel production_id:audio_id chapter_ids:chapter_ids];
audioDownloadManager.downloadChapterStateChangeBlock = ^(WXYZ_DownloadChapterState state, NSInteger production_id, NSInteger chapter_id) {
TFAudioDirectoryViewCell *cell = [self.mainTableView cellForRowAtIndexPath:indexPath];
switch (state) {
case WXYZ_DownloadStateChapterDownloadStart:
cell.cellDownloadState = WXYZ_ProductionDownloadStateDownloading;
break;
case WXYZ_DownloadStateChapterDownloadFinished:
cell.cellDownloadState = WXYZ_ProductionDownloadStateDownloaded;
break;
case WXYZ_DownloadStateChapterDownloadFail:
cell.cellDownloadState = WXYZ_ProductionDownloadStateFail;
break;
default:
break;
}
};
audioDownloadManager.downloadMissionStateChangeBlock = ^(WXYZ_DownloadMissionState state, NSInteger production_id, NSArray * _Nonnull chapter_ids) {
switch (state) {
case WXYZ_DownloadStateMissionShouldPay:
{
TFProductionChapterModel *t_chapterList = [weakSelf.directoryModel.chapter_list objectOrNilAtIndex:indexPath.row];
t_chapterList.chapter_ids = @[[TFUtilsHelper formatStringWithInteger:t_chapterList.chapter_id]];
dispatch_async(dispatch_get_main_queue(), ^{
WXYZ_ChapterBottomPayBar *payBar = [[WXYZ_ChapterBottomPayBar alloc] initWithChapterModel:t_chapterList barType:WXYZ_BottomPayBarTypeDownload productionType:TFProductionTypeAudio];
payBar.paySuccessChaptersBlock = ^(NSArray<NSString *> * _Nonnull success_chapter_ids) {
[weakSelf requestChapterDownloadDataWithAudio_id:audio_id chapter_ids:chapter_ids indexPath:indexPath];
};
payBar.payFailChaptersBlock = ^(NSArray<NSString *> * _Nonnull fail_chapter_ids) {
TFAudioDirectoryViewCell *cell = [self.mainTableView cellForRowAtIndexPath:indexPath];
cell.audioDirectoryModel = cell.audioDirectoryModel;
cell.cellDownloadState = WXYZ_ProductionDownloadStateNormal;
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"购买失败")];
};
payBar.payCancleChapterBlock = ^(NSArray<NSString *> * _Nonnull fail_chapter_ids) {
TFAudioDirectoryViewCell *cell = [self.mainTableView cellForRowAtIndexPath:indexPath];
cell.audioDirectoryModel = cell.audioDirectoryModel;
cell.cellDownloadState = WXYZ_ProductionDownloadStateNormal;
};
[payBar showBottomPayBar];
});
}
break;
default:
break;
}
};
}
@end
@@ -0,0 +1,20 @@
//
// TFAudioRecommendedViewController.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TFBasicViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface TFAudioRecommendedViewController : TFBasicViewController
@property (nonatomic ,assign) BOOL canScroll;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,154 @@
//
// TFAudioRecommendedViewController.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFAudioRecommendedViewController.h"
#import "TFAudioRecommendedViewCell.h"
#import "TFAudioRecommendedModel.h"
@interface TFAudioRecommendedViewController ()<UITableViewDelegate, UITableViewDataSource>
@end
@implementation TFAudioRecommendedViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self initialize];
[self createSubviews];
[self netRequest];
}
- (void)initialize
{
[self hiddenNavigationBar:YES];
}
- (void)createSubviews
{
self.mainTableView.delegate = self;
self.mainTableView.dataSource = self;
self.mainTableView.contentInset = UIEdgeInsetsMake(0, 0, PUB_TABBAR_OFFSET, 0);
[self.view addSubview:self.mainTableView];
[self.mainTableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view);
}];
[self setEmptyOnView:self.mainTableView title:TFLocalizedString(@"暂无数据") buttonTitle:nil tapBlock:^{
}];
WS(weakSelf)
self.mainTableView.mj_header = [TFRefreshHeader headerWithRefreshingBlock:^{
weakSelf.currentPageNumber = 1;
[weakSelf netRequest];
}];
self.mainTableView.mj_footer = [TFRefreshFooter footerWithRefreshingBlock:^{
weakSelf.currentPageNumber ++;
[weakSelf netRequest];
}];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataSourceArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellName = @"TFAudioRecommendedViewCell";
TFAudioRecommendedViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
if (!cell) {
cell = [[TFAudioRecommendedViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellName];
}
cell.productionType = self.productionType;
[cell setListModel:[self.dataSourceArray objectOrNilAtIndex:indexPath.row]];
cell.hiddenEndLine = (indexPath.row == self.dataSourceArray.count - 1);
WS(weakSelf)
cell.clickBlock = ^(NSInteger production_id) {
TFAudioDetailViewController *vc = [[TFAudioDetailViewController alloc] init];
vc.audio_id = production_id;
[weakSelf.navigationController pushViewController:vc animated:YES];
};
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return CGFLOAT_MIN;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, PUB_TABBAR_OFFSET == 0 ? 10 : PUB_TABBAR_OFFSET)];
view.backgroundColor = [UIColor clearColor];
return view;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
TFProductionModel *t_model = [self.dataSourceArray objectOrNilAtIndex:indexPath.row];
TFAudioDetailViewController *vc = [[TFAudioDetailViewController alloc] init];
vc.audio_id = t_model.production_id;
[self.navigationController pushViewController:vc animated:YES];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if ([scrollView isEqual:self.mainTableView]) {
if (!self.canScroll) {
scrollView.contentOffset = CGPointZero;
}
if (scrollView.contentOffset.y > 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Audio_Can_Leave_Top object:@NO];
}
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y <= 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Audio_Can_Leave_Top object:@YES];
}
}
- (void)netRequest
{
WS(weakSelf)
[TFNetworkTools POST:Audio_Info_Recommend parameters:@{@"page_num":[TFUtilsHelper formatStringWithInteger:self.currentPageNumber]} model:TFAudioRecommendedModel.class success:^(BOOL isSuccess, TFAudioRecommendedModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) {
[weakSelf.mainTableView endRefreshing];
if (isSuccess) {
if (weakSelf.currentPageNumber == 1) {
[weakSelf.mainTableView showRefreshFooter];
[weakSelf.dataSourceArray removeAllObjects];
weakSelf.dataSourceArray = [NSMutableArray arrayWithArray:t_model.list];
} else {
[weakSelf.dataSourceArray addObjectsFromArray:t_model.list];
}
if (t_model.total_page <= t_model.current_page) {
[weakSelf.mainTableView hideRefreshFooter];
}
}
[weakSelf.mainTableView reloadData];
[weakSelf.mainTableView xtfei_endLoading];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[weakSelf.mainTableView endRefreshing];
[weakSelf.mainTableView reloadData];
[weakSelf.mainTableView xtfei_endLoading];
}];
}
@end
@@ -0,0 +1,21 @@
//
// TFAudioDetailModel.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface TFAudioDetailModel : NSObject
@property (nonatomic ,strong) TFProductionModel *audio;
@property (nonatomic ,strong) NSArray <NSString *> *color;
@property (nonatomic ,assign) NSInteger is_vip;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,28 @@
//
// TFAudioDetailModel.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFAudioDetailModel.h"
@implementation TFAudioDetailModel
+ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass
{
return @{
@"audio" : [TFProductionModel class]
};
}
+ (NSDictionary *)modelCustomPropertyMapper
{
return @{
@"color" :@"audio.color",
@"is_vip" :@"user.is_vip"
};
}
@end
@@ -0,0 +1,30 @@
//
// TFAudioRecommendedModel.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class TFAudioContentModel, TFPagingModel;
@interface TFAudioRecommendedModel : TFPagingModel
@property (nonatomic ,strong) NSArray <TFAudioContentModel *>*list;
@end
@interface TFAudioContentModel : TFProductionModel
@property (nonatomic ,assign) BOOL is_vip; // 是否是vip章节
@property (nonatomic ,assign) BOOL is_finish; // 是否已完结
@property (nonatomic ,assign) NSInteger views; // 观看数
@property (nonatomic ,assign) NSInteger total_views;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,23 @@
//
// TFAudioRecommendedModel.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFAudioRecommendedModel.h"
@implementation TFAudioRecommendedModel
+ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass
{
return @{@"list" : [TFAudioContentModel class]};
}
@end
@implementation TFAudioContentModel
@end
@@ -0,0 +1,27 @@
//
// TFAudioDetailFooterView.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef void(^PushToComicDetailBlock)(NSInteger production_id);
@interface TFAudioDetailFooterView : TFBasicViewController
@property (nonatomic ,assign) BOOL canScroll;
@property (nonatomic ,assign) CGFloat contentOffSetY;
@property (nonatomic ,assign) NSInteger audio_id;
@property (nonatomic ,strong) TFProductionModel *directoryModel;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,87 @@
//
// TFAudioDetailFooterView.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFAudioDetailFooterView.h"
#import "TFAudioRecommendedViewController.h"
#import "TFAudioDirectoryViewController.h"
@interface TFAudioDetailFooterView ()<SGPageTitleViewDelegate, SGPageContentCollectionViewDelegate>
{
TFAudioRecommendedViewController *rightVC;
TFAudioDirectoryViewController *leftVC;
}
@property (nonatomic ,strong) SGPageTitleView *pageTitleView;
@property (nonatomic ,strong) SGPageContentCollectionView *pageContentCollectionView;
@end
@implementation TFAudioDetailFooterView
- (void)viewDidLoad
{
[super viewDidLoad];
[self hiddenNavigationBar:YES];
[self createSubViews];
}
- (void)createSubViews
{
leftVC = [[TFAudioDirectoryViewController alloc] init];
leftVC.directoryModel = self.directoryModel;
[self addChildViewController:leftVC];
rightVC = [[TFAudioRecommendedViewController alloc] init];
rightVC.productionType = TFProductionTypeAudio;
[self addChildViewController:rightVC];
NSArray *childArr = @[leftVC, rightVC];
NSArray *titleArr = @[TFLocalizedString(@"目录"), TFLocalizedString(@"推荐")];
self.pageContentCollectionView = [[SGPageContentCollectionView alloc] initWithFrame:CGRectMake(0, 44.6, self.view.width, SCREEN_HEIGHT - PUB_NAVBAR_HEIGHT - 44) parentVC:self childVCs:childArr];
self.pageContentCollectionView.delegatePageContentCollectionView = self;
[self.view addSubview:self.pageContentCollectionView];
self.pageConfigure.bottomSeparatorColor = kGrayLineColor;
self.pageConfigure.titleFont = kMainFont;
self.pageConfigure.titleSelectedColor = kBlackColor;
self.pageTitleView = [SGPageTitleView pageTitleViewWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 44) delegate:self titleNames:titleArr configure:self.pageConfigure];
self.pageTitleView.backgroundColor = [UIColor whiteColor];
[self.pageTitleView addRoundingCornersWithRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)];
[self.view addSubview:self.pageTitleView];
}
- (void)setDirectoryModel:(TFProductionModel *)directoryModel
{
_directoryModel = directoryModel;
leftVC.directoryModel = directoryModel;
}
- (void)setAudio_id:(NSInteger)audio_id
{
_audio_id = audio_id;
leftVC.audio_id = self.audio_id;
}
- (void)setCanScroll:(BOOL)canScroll
{
rightVC.canScroll = canScroll;
leftVC.canScroll = canScroll;
}
- (void)pageTitleView:(SGPageTitleView *)pageTitleView selectedIndex:(NSInteger)selectedIndex {
[self.pageContentCollectionView setPageContentCollectionViewCurrentIndex:selectedIndex];
}
- (void)pageContentCollectionView:(SGPageContentCollectionView *)pageContentCollectionView progress:(CGFloat)progress originalIndex:(NSInteger)originalIndex targetIndex:(NSInteger)targetIndex {
[self.pageTitleView setPageTitleViewWithProgress:progress originalIndex:originalIndex targetIndex:targetIndex];
}
@end
@@ -0,0 +1,24 @@
//
// TFAudioDetailHeaderView.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface TFAudioDetailHeaderView : UIView
@property (nonatomic ,strong) TFProductionModel *audioModel;
@property (nonatomic ,copy) void (^changeIntroductionBlock)(CGFloat headerViewHeight, BOOL viewEnable);
@property (nonatomic ,assign) CGFloat contentOffSetY;
- (void)reloadCollectionButtonState;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,642 @@
//
// TFAudioDetailHeaderView.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFAudioDetailHeaderView.h"
#import "TFUpgradeMemberController.h"
#import "TFCollectionManager.h"
#import "TFReadRecordManager.h"
#import "TFAdvertisementManager.h"
#import "UIView+AZGradient.h"
#import "UILabel+LineBreak.h"
#import "UIView+BorderLine.h"
@interface TFAudioDetailHeaderView ()
{
UIView *contentView;
UILabel *navTitleLabel;
UIImageView *coverImageView;
UILabel *audioTitleLabel;
UILabel *hotLabel;
UIImageView *authorIcon;
UILabel *authorLabel;
UILabel *collectNumLabel;
TFButton *collectButton;
UILabel *tagView;
UIView *introductionView;
UILabel *introductionLabel;
TFButton *moreButton;
UIButton *vipButton;
// 展开详情后视图样式
UILabel *introductionBottomLabel;
TFButton *packUpButton;
TFButton *bottomPackUpButton;
TFAdvertisementManager *adView;
}
@property (nonatomic ,strong) YYTextView *introductionTextView;
@end
@implementation TFAudioDetailHeaderView
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor clearColor];
self.frame = frame;
[self createSubViews];
}
return self;
}
- (void)createSubViews
{
contentView = [[UIView alloc] init];
contentView.backgroundColor = [UIColor clearColor];
[self addSubview:contentView];
[contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.mas_left);
make.top.mas_equalTo(self.mas_top);
make.width.mas_equalTo(self.mas_width);
make.height.mas_equalTo(self.mas_height);
}];
navTitleLabel = [[UILabel alloc] init];
navTitleLabel.alpha = 0;
navTitleLabel.textColor = kWhiteColor;
navTitleLabel.textAlignment = NSTextAlignmentLeft;
navTitleLabel.font = kBoldMainFont;
[contentView addSubview:navTitleLabel];
[navTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kHalfMargin + 44);
make.top.mas_equalTo(PUB_NAVBAR_HEIGHT - 44);
make.width.mas_equalTo(SCREEN_WIDTH / 2 - 44);
make.height.mas_equalTo(44);
}];
coverImageView = [[UIImageView alloc] initWithCornerRadiusAdvance:4 rectCornerType:UIRectCornerAllCorners];
coverImageView.image = HoldImage;
coverImageView.contentMode = UIViewContentModeScaleAspectFill;
[contentView addSubview:coverImageView];
[coverImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.top.mas_equalTo(PUB_NAVBAR_HEIGHT + kHalfMargin);
make.width.mas_equalTo(SCREEN_WIDTH / 4 + kMargin);
make.height.mas_equalTo(kGeometricHeight((SCREEN_WIDTH / 4 + kMargin), 3, 4));
}];
audioTitleLabel = [[UILabel alloc] init];
audioTitleLabel.textColor = kWhiteColor;
audioTitleLabel.textAlignment = NSTextAlignmentLeft;
audioTitleLabel.font = kBoldFont22;
[contentView addSubview:audioTitleLabel];
[audioTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(coverImageView.mas_right).with.offset(kHalfMargin);
make.top.mas_equalTo(coverImageView.mas_top);
make.right.mas_equalTo(contentView.mas_right).with.offset(- kHalfMargin);
make.height.mas_equalTo(30);
}];
tagView = [[UILabel alloc] init];
tagView.backgroundColor = [UIColor clearColor];
tagView.textColor = kColorRGBA(255, 255, 255, 0.9);
tagView.textAlignment = NSTextAlignmentLeft;
tagView.font = kFont12;
[contentView addSubview:tagView];
[tagView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(audioTitleLabel.mas_left);
make.top.mas_equalTo(audioTitleLabel.mas_bottom).with.offset(kQuarterMargin);
make.right.mas_equalTo(audioTitleLabel.mas_right);
make.height.mas_equalTo(25);
}];
hotLabel = [[UILabel alloc] init];
hotLabel.backgroundColor = [UIColor clearColor];
hotLabel.textColor = kColorRGBA(255, 255, 255, 0.9);
hotLabel.textAlignment = NSTextAlignmentLeft;
hotLabel.font = kFont12;
[contentView addSubview:hotLabel];
[hotLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(audioTitleLabel.mas_left);
make.top.mas_equalTo(tagView.mas_bottom);
make.right.mas_equalTo(audioTitleLabel.mas_right);
make.height.mas_equalTo(tagView.mas_height);
}];
collectNumLabel = [[UILabel alloc] init];
collectNumLabel.backgroundColor = [UIColor clearColor];
collectNumLabel.textColor = kColorRGBA(255, 255, 255, 0.9);
collectNumLabel.textAlignment = NSTextAlignmentLeft;
collectNumLabel.font = kFont12;
[contentView addSubview:collectNumLabel];
[collectNumLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(audioTitleLabel.mas_left);
make.top.mas_equalTo(hotLabel.mas_bottom);
make.right.mas_equalTo(audioTitleLabel.mas_right);
make.height.mas_equalTo(tagView.mas_height);
}];
collectButton = [[TFButton alloc] initWithFrame:CGRectMake(1, 1, 1, 1) buttonTitle:TFLocalizedString(@"收藏") buttonImageName:@"audio_collection_heart" buttonIndicator:TFButtonIndicatorTitleRight];
collectButton.buttonImageScale = 0.4;
collectButton.buttonTitleFont = kFont12;
collectButton.graphicDistance = 2;
collectButton.buttonTitleColor = kWhiteColor;
collectButton.hidden = YES;
collectButton.layer.cornerRadius = 14;
collectButton.clipsToBounds = YES;
[collectButton addTarget:self action:@selector(collectionButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[contentView addSubview:collectButton];
[collectButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(contentView.mas_right).with.offset(-kMargin);
make.bottom.mas_equalTo(coverImageView.mas_bottom);
make.height.mas_equalTo(28);
make.width.mas_equalTo(80);
}];
authorIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"audio_detail_author"]];
authorIcon.hidden = YES;
[contentView addSubview:authorIcon];
[authorIcon mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(collectNumLabel.mas_left);
make.bottom.mas_equalTo(coverImageView.mas_bottom).with.offset(- 2);
make.width.height.mas_equalTo(20);
}];
authorLabel = [[UILabel alloc] init];
authorLabel.backgroundColor = [UIColor clearColor];
authorLabel.textColor = kWhiteColor;
authorLabel.textAlignment = NSTextAlignmentLeft;
authorLabel.font = kMainFont;
[contentView addSubview:authorLabel];
[authorLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(authorIcon.mas_right).with.offset(kHalfMargin);
make.bottom.mas_equalTo(authorIcon.mas_bottom);
make.right.mas_equalTo(collectButton.mas_left).with.offset(- kHalfMargin);
make.height.mas_equalTo(authorIcon.mas_height);
}];
introductionView = [[UIView alloc] init];
introductionView.backgroundColor = kColorRGBA(0, 0, 0, 0.2);
introductionView.layer.cornerRadius = 6;
introductionView.hidden = YES;
introductionView.userInteractionEnabled = YES;
[contentView addSubview:introductionView];
introductionLabel = [[UILabel alloc] init];
introductionLabel.textColor = kColorRGBA(255, 255, 255, 0.9);
introductionLabel.font = kFont12;
introductionLabel.backgroundColor = [UIColor clearColor];
introductionLabel.numberOfLines = 0;
introductionLabel.userInteractionEnabled = YES;
[contentView addSubview:introductionLabel];
[introductionLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin + kHalfMargin);
make.right.mas_equalTo(contentView.mas_right).with.offset(- kMargin - kHalfMargin);
make.top.mas_equalTo(coverImageView.mas_bottom).with.offset(kMargin + kHalfMargin);
make.height.mas_equalTo(80);
}];
[introductionView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(introductionLabel.mas_left).with.offset(- kHalfMargin);
make.right.mas_equalTo(introductionLabel.mas_right).with.offset(kHalfMargin);
make.top.mas_equalTo(introductionLabel.mas_top).with.offset(- kQuarterMargin);
make.bottom.mas_equalTo(introductionLabel.mas_bottom).with.offset(kQuarterMargin);
}];
moreButton = [[TFButton alloc] initWithFrame:CGRectZero buttonTitle:TFLocalizedString(@"展开简介") buttonImageName:@"public_down_arrow" buttonIndicator:TFButtonIndicatorTitleLeft];
moreButton.buttonTitleFont = kFont10;
moreButton.buttonImageScale = 0.5;
moreButton.graphicDistance = 3;
moreButton.buttonTintColor = kWhiteColor;
moreButton.backgroundColor = kColorRGBA(255, 255, 255, 0.2);
moreButton.layer.cornerRadius = 10;
[moreButton addTarget:self action:@selector(spreadClick) forControlEvents:UIControlEventTouchUpInside];
[contentView addSubview:moreButton];
[moreButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(introductionLabel.mas_right).with.offset(- kQuarterMargin);
make.bottom.mas_equalTo(introductionLabel.mas_bottom).with.offset(- 2.5);
make.width.mas_equalTo(80);
make.height.mas_equalTo(20);
}];
vipButton = [UIButton buttonWithType:UIButtonTypeCustom];
vipButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
vipButton.contentHorizontalAlignment = UIControlContentVerticalAlignmentFill;
[vipButton setImage:[UIImage imageNamed:TFLocalizedString(@"audio_detail_member")] forState:UIControlStateNormal];
[vipButton addTarget:self action:@selector(vipButtonClick) forControlEvents:UIControlEventTouchUpInside];
[contentView addSubview:vipButton];
[vipButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.top.mas_equalTo(introductionView.mas_bottom).with.offset(kMargin);
make.width.mas_equalTo(SCREEN_WIDTH - 2 * kMargin);
make.height.mas_equalTo(CGFLOAT_MIN);
}];
adView = [[TFAdvertisementManager alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH - kMargin * 2, kGeometricHeight(SCREEN_WIDTH - kMargin * 2, 3, 1)) advertisementType:TFAdvertisementTypeNovel advertisementPosition:TFAdvertisementPositionNone];
adView.backgroundColor = [UIColor clearColor];
adView.userInteractionEnabled = YES;
[contentView addSubview:adView];
[adView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.width.mas_equalTo(SCREEN_WIDTH - 2 * kMargin);
make.height.mas_equalTo(kGeometricHeight(SCREEN_WIDTH - kMargin, 3, 1));
make.top.mas_equalTo(vipButton.mas_bottom).with.offset(kMargin);
make.bottom.mas_equalTo(contentView.mas_bottom).with.offset(- kMargin).priorityLow();
}];
// 展开详情后视图
introductionBottomLabel = [[UILabel alloc] init];
introductionBottomLabel.text = TFLocalizedString(@"简介");
introductionBottomLabel.textColor = kWhiteColor;
introductionBottomLabel.textAlignment = NSTextAlignmentLeft;
introductionBottomLabel.font = kBoldFont22;
introductionBottomLabel.alpha = 0;
[contentView addSubview:introductionBottomLabel];
[introductionBottomLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.top.mas_equalTo(coverImageView.mas_bottom).with.offset(kMargin);
make.width.mas_equalTo(SCREEN_WIDTH / 2);
make.height.mas_equalTo(30);
}];
packUpButton = [[TFButton alloc] initWithFrame:CGRectZero buttonTitle:TFLocalizedString(@"收起简介") buttonImageName:@"public_down_arrow" buttonIndicator:TFButtonIndicatorTitleLeft];
packUpButton.alpha = 0;
packUpButton.transformImageView = YES;
packUpButton.buttonTitleFont = kFont10;
packUpButton.buttonImageScale = 0.5;
packUpButton.graphicDistance = 3;
packUpButton.buttonTintColor = kWhiteColor;
packUpButton.backgroundColor = kColorRGBA(255, 255, 255, 0.2);
packUpButton.layer.cornerRadius = 10;
[packUpButton addTarget:self action:@selector(packUpClick) forControlEvents:UIControlEventTouchUpInside];
[contentView addSubview:packUpButton];
[packUpButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(contentView.mas_right).with.offset(- kMargin);
make.centerY.mas_equalTo(introductionBottomLabel.mas_centerY);
make.width.mas_equalTo(80);
make.height.mas_equalTo(20);
}];
self.introductionTextView = [[YYTextView alloc] init];
self.introductionTextView.editable = NO;
self.introductionTextView.textColor = kWhiteColor;
self.introductionTextView.font = kMainFont;
self.introductionTextView.alpha = 0;
self.introductionTextView.showsVerticalScrollIndicator = NO;
self.introductionTextView.showsHorizontalScrollIndicator = NO;
[contentView addSubview:self.introductionTextView];
[self.introductionTextView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(introductionBottomLabel.mas_left);
make.right.mas_equalTo(packUpButton.mas_right);
make.top.mas_equalTo(introductionBottomLabel.mas_bottom).with.offset(kHalfMargin);
make.bottom.mas_equalTo(contentView.mas_bottom).priorityLow();
}];
bottomPackUpButton = [[TFButton alloc] initWithFrame:CGRectZero buttonTitle:TFLocalizedString(@"点击收起") buttonImageName:@"public_down_arrow" buttonIndicator:TFButtonIndicatorTitleLeft];
bottomPackUpButton.alpha = 0;
bottomPackUpButton.transformImageView = YES;
bottomPackUpButton.buttonTitleFont = kMainFont;
bottomPackUpButton.buttonImageScale = 0.4;
bottomPackUpButton.graphicDistance = 5;
bottomPackUpButton.buttonTintColor = kWhiteColor;
bottomPackUpButton.backgroundColor = kBlackTransparentColor;
bottomPackUpButton.layer.cornerRadius = 20;
[bottomPackUpButton addTarget:self action:@selector(packUpClick) forControlEvents:UIControlEventTouchUpInside];
[contentView addSubview:bottomPackUpButton];
[bottomPackUpButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(contentView.mas_centerX);
make.bottom.mas_equalTo(contentView.mas_bottom).with.offset(- 2 * kMargin);
make.width.mas_equalTo(135);
make.height.mas_equalTo(40);
}];
}
- (void)setAudioModel:(TFProductionModel *)audioModel
{
_audioModel = audioModel;
collectButton.hidden = NO;
[coverImageView setImageWithURL:[NSURL URLWithString:audioModel.cover] placeholder:HoldImage options:YYWebImageOptionSetImageWithFadeAnimation completion:nil];
navTitleLabel.text = audioModel.name?:@"";
audioTitleLabel.text = audioModel.name?:@"";
hotLabel.text = audioModel.hot_num?:@"";
collectNumLabel.text = audioModel.total_favors?:@"";
authorIcon.hidden = NO;
authorLabel.text = audioModel.author.length > 0 ?audioModel.author:@"--";
NSMutableArray *tagArray = [NSMutableArray array];
for (TFTagModel *tagModel in audioModel.tag) {
[tagArray addObject:tagModel.tab];
}
tagView.text = [tagArray componentsJoinedByString:@"|"]?:@"";
[self reloadCollectionButtonState];
[vipButton mas_updateConstraints:^(MASConstraintMaker *make) {
if ([TFUserInfoManager shareInstance].isVip) {
make.top.mas_equalTo(introductionView.mas_bottom).with.offset(CGFLOAT_MIN);
make.height.mas_equalTo(CGFLOAT_MIN);
} else if (!audioModel.is_baoyue) {
make.top.mas_equalTo(introductionView.mas_bottom).with.offset(CGFLOAT_MIN);
make.height.mas_equalTo(CGFLOAT_MIN);
} else {
make.top.mas_equalTo(introductionView.mas_bottom).with.offset(kMargin);
make.height.mas_equalTo(kGeometricHeight(SCREEN_WIDTH - 2 * kMargin, 800, 90));
}
}];
adView.advertModel = audioModel;
[adView mas_updateConstraints:^(MASConstraintMaker *make) {
if (audioModel.ad_type == 0) {
make.top.mas_equalTo(vipButton.mas_bottom).with.offset(CGFLOAT_MIN);
make.height.mas_equalTo(CGFLOAT_MIN);
} else {
make.top.mas_equalTo(vipButton.mas_bottom).with.offset(kMargin);
make.height.mas_equalTo(kGeometricHeight(SCREEN_WIDTH - kMargin, audioModel.ad_width?:3, audioModel.ad_height?:1));
}
}];
[introductionBottomLabel mas_updateConstraints:^(MASConstraintMaker *make) {
if (audioModel.ad_type == 0) {
make.top.mas_equalTo(coverImageView.mas_bottom).with.offset(kMargin);
} else {
make.top.mas_equalTo(coverImageView.mas_bottom).with.offset(kHalfMargin + kMargin + kGeometricHeight(SCREEN_WIDTH - kMargin, audioModel.ad_width?:3, audioModel.ad_height?:1));
}
}];
introductionView.hidden = NO;
{
if (audioModel.production_descirption.length > 0) {
// 截取简介
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:audioModel.production_descirption?:@""];
attributedString.lineSpacing = 6;
attributedString.font = kFont12;
attributedString.color = kWhiteColor;
CGFloat maxWidth = SCREEN_WIDTH - 2 * (kMargin + kHalfMargin) - 120.0;
NSAttributedString *separatedString = [TFViewHelper getSubContentWithOriginalContent:attributedString labelWidth:maxWidth labelMaxLine:3];
introductionLabel.attributedText = separatedString;
[introductionLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(coverImageView.mas_bottom).with.offset(kMargin + kHalfMargin);
make.height.mas_equalTo([TFViewHelper boundsWithFont:kFont12 attributedText:separatedString needWidth:(SCREEN_WIDTH - 2 * (kMargin + kHalfMargin)) lineSpacing:6] + kHalfMargin);
}];
[introductionView mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(introductionLabel.mas_top).with.offset(- kQuarterMargin);
make.bottom.mas_equalTo(introductionLabel.mas_bottom).with.offset(kQuarterMargin);
}];
moreButton.hidden = NO;
} else {
moreButton.hidden = YES;
[introductionLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(coverImageView.mas_bottom).with.offset(CGFLOAT_MIN);
make.height.mas_equalTo(CGFLOAT_MIN);
}];
[introductionView mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(introductionLabel.mas_top).with.offset(CGFLOAT_MIN);
make.bottom.mas_equalTo(introductionLabel.mas_bottom).with.offset(CGFLOAT_MIN);
}];
}
}
NSMutableAttributedString __block *attributedString = [[NSMutableAttributedString alloc] initWithString:audioModel.production_descirption?:@""];
attributedString.lineSpacing = 8;
attributedString.font = kMainFont;
attributedString.color = kWhiteColor;
[attributedString appendString:@"\n"];
if (audioModel.horizontal_cover.length > 0) {
WS(weakSelf)
[[YYWebImageManager sharedManager] requestImageWithURL:[NSURL URLWithString:audioModel.horizontal_cover?:@""] options:YYWebImageOptionSetImageWithFadeAnimation progress:nil transform:nil completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
YYAnimatedImageView *imageView = nil;
if (image) {
imageView = [[YYAnimatedImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(0, 0, SCREEN_WIDTH - 2 * kMargin, kGeometricHeight(SCREEN_WIDTH - 2 * kMargin, image.size.width, image.size.height));
}
NSMutableAttributedString *attachText = [NSMutableAttributedString attachmentStringWithContent:imageView contentMode:UIViewContentModeScaleAspectFit attachmentSize:imageView.frame.size alignToFont:kMainFont alignment:YYTextVerticalAlignmentCenter];
[attributedString appendAttributedString:attachText];
weakSelf.introductionTextView.attributedText = attributedString;
});
}];
} else {
self.introductionTextView.attributedText = attributedString;
}
[self layoutIfNeeded];
if (self.changeIntroductionBlock) {
if ([[TFUserInfoManager shareInstance] isVip] || !audioModel.is_baoyue) {
self.changeIntroductionBlock(adView.bottom + kHalfMargin, YES);
} else {
self.changeIntroductionBlock(adView.bottom + kHalfMargin, YES);
}
}
}
- (void)setContentOffSetY:(CGFloat)contentOffSetY
{
_contentOffSetY = contentOffSetY;
if (contentOffSetY < self.bottom - PUB_NAVBAR_HEIGHT) {
navTitleLabel.alpha = 0;
[collectButton mas_remakeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(contentView.mas_right).with.offset(- kMargin);
make.bottom.mas_equalTo(coverImageView.mas_bottom);
make.height.mas_equalTo(28);
make.width.mas_equalTo(80);
}];
} else if (contentOffSetY > 0){
navTitleLabel.alpha = 1;
[collectButton mas_remakeConstraints:^(MASConstraintMaker *make) {
//#if TF_Download_Mode && (TF_FB_Share_Mode || TF_Twitter_Share_Mode)
make.right.mas_equalTo(contentView.mas_right).with.offset(-2 *kHalfMargin - kMargin - 60);
//#elif TF_Download_Mode || TF_FB_Share_Mode || TF_Twitter_Share_Mode
// make.right.mas_equalTo(contentView.mas_right).with.offset(- kHalfMargin - kMargin - 30);
//#else
// make.right.mas_equalTo(contentView.mas_right).with.offset(- kMargin);
//#endif
make.centerY.mas_equalTo(navTitleLabel.mas_centerY);
make.height.mas_equalTo(28);
make.width.mas_equalTo(80);
}];
}
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeAudio] isCollectedWithProductionModel:self.audioModel]) {
[collectButton mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo([TFViewHelper getDynamicWidthWithLabelFont:kFont12 labelHeight:28 labelText:collectButton.buttonTitle] + 20);
}];
} else {
[collectButton mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo([TFViewHelper getDynamicWidthWithLabelFont:kFont12 labelHeight:28 labelText:collectButton.buttonTitle] + 30);
}];
}
[contentView mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.mas_top).with.offset(contentOffSetY);
make.height.mas_equalTo(self.mas_height).with.offset(contentOffSetY);
}];
}
// 展开详情
- (void)spreadClick
{
[UIView animateWithDuration:kAnimatedDurationFast animations:^{
moreButton.alpha = 0;
introductionLabel.alpha = 0;
introductionView.alpha = 0;
vipButton.alpha = 0;
packUpButton.alpha = 1;
bottomPackUpButton.alpha = 1;
introductionBottomLabel.alpha = 1;
self.introductionTextView.alpha = 1;
}];
[adView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.width.mas_equalTo(SCREEN_WIDTH - 2 * kMargin);
if (self.audioModel.ad_type == 0) {
make.height.mas_equalTo(CGFLOAT_MIN);
} else {
make.height.mas_equalTo(kGeometricHeight(SCREEN_WIDTH - kMargin, self.audioModel.ad_width?:3, self.audioModel.ad_height?:1));
}
make.top.mas_equalTo(coverImageView.mas_bottom).with.offset(kMargin);
make.bottom.mas_equalTo(contentView.mas_bottom).with.offset(- kMargin).priorityLow();
}];
if (self.changeIntroductionBlock) {
self.changeIntroductionBlock(SCREEN_HEIGHT, NO);
}
}
// 收起详情
- (void)packUpClick
{
packUpButton.alpha = 0;
bottomPackUpButton.alpha = 0;
[UIView animateWithDuration:kAnimatedDurationFast animations:^{
moreButton.alpha = 1;
introductionLabel.alpha = 1;
introductionView.alpha = 1;
vipButton.alpha = 1;
introductionBottomLabel.alpha = 0;
self.introductionTextView.alpha = 0;
} completion:^(BOOL finished) {
if (self.changeIntroductionBlock) {
self.changeIntroductionBlock(adView.bottom + kHalfMargin, YES);
}
}];
[adView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.width.mas_equalTo(SCREEN_WIDTH - 2 * kMargin);
if (self.audioModel.ad_type == 0) {
make.top.mas_equalTo(vipButton.mas_bottom).with.offset(CGFLOAT_MIN);
make.height.mas_equalTo(CGFLOAT_MIN);
} else {
make.top.mas_equalTo(vipButton.mas_bottom).with.offset(kMargin);
make.height.mas_equalTo(kGeometricHeight(SCREEN_WIDTH - kMargin, self.audioModel.ad_width?:3, self.audioModel.ad_height?:1));
}
make.bottom.mas_equalTo(contentView.mas_bottom).with.offset(- kMargin).priorityLow();
}];
}
- (void)vipButtonClick
{
WS(weakSelf)
TFUpgradeMemberController *vc = [[TFUpgradeMemberController alloc] init];
vc.paySuccessBlock = ^{
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Audio_Check_Recommend object:[TFUtilsHelper formatStringWithInteger:[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeAudio] getReadingRecordChapter_idWithProduction_id:weakSelf.audioModel.production_id]]];
};
[[TFViewHelper getWindowRootController] presentViewController:vc animated:YES completion:nil];
}
- (void)collectionButtonClick:(TFButton *)sender
{
if (![[TFCollectionManager shareManagerWithProductionType:TFProductionTypeAudio] isCollectedWithProductionModel:self.audioModel]) {
[[TFCollectionManager shareManagerWithProductionType:TFProductionTypeAudio] addCollectionWithProductionModel:self.audioModel];
[TFPromptManager showPromptViewWithStatus:TFPromptStatusSuccess promptTitle:TFLocalizedString(@"已加入书架")];
[self reloadCollectionButtonState];
}
[TFUtilsHelper synchronizationRackProductionWithProduction_id:self.audioModel.production_id productionType:TFProductionTypeAudio complete:nil];
}
- (void)reloadCollectionButtonState
{
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeAudio] isCollectedWithProductionModel:self.audioModel]) {
collectButton.buttonImageScale = 0;
collectButton.buttonTitle = TFLocalizedString(@"已收藏");
collectButton.horizontalMigration = - 3;
[collectButton selectBackgroundColor];
collectButton.tag = 2;
[collectButton mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo([TFViewHelper getDynamicWidthWithLabelFont:kFont12 labelHeight:28 labelText:collectButton.buttonTitle] + 20);
}];
} else {
collectButton.buttonImageScale = 0.4;
collectButton.buttonTitle = TFLocalizedString(@"收藏");
collectButton.horizontalMigration = 0;
[collectButton normalBackgroundColor];
collectButton.tag = 1;
[collectButton mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo([TFViewHelper getDynamicWidthWithLabelFont:kFont12 labelHeight:28 labelText:collectButton.buttonTitle] + 30);
}];
}
}
@end
@@ -0,0 +1,23 @@
//
// TFAudioDirectoryViewCell.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "WXYZ_DownloadManagerEnumProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface TFAudioDirectoryViewCell : TFBasicTableViewCell
@property (nonatomic ,copy) void (^downloadChapterBlock)(NSInteger audio_id, NSInteger chapter_id, NSIndexPath *cellIndexPath);
@property (nonatomic ,strong) TFProductionChapterModel *audioDirectoryModel;
@property (nonatomic ,assign) WXYZ_ProductionDownloadState cellDownloadState;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,229 @@
//
// TFAudioDirectoryViewCell.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFAudioDirectoryViewCell.h"
#import "TFReadRecordManager.h"
#import "WXYZ_AudioDownloadManager.h"
@interface TFAudioDirectoryViewCell ()
@property (nonatomic ,strong) UILabel *titleLabel;
@property (nonatomic ,strong) UIImageView *playAmountIconView;
@property (nonatomic ,strong) UILabel *playAmountLabel;
@property (nonatomic ,strong) UIImageView *updateTimeIconView;
@property (nonatomic ,strong) UILabel *updateTimeLabel;
@property (nonatomic ,strong) UIButton *downloadBtn;
@end
@implementation TFAudioDirectoryViewCell
- (void)createSubviews
{
[super createSubviews];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.textAlignment = NSTextAlignmentLeft;
self.titleLabel.textColor = kBlackColor;
self.titleLabel.font = kMainFont;
[self.contentView addSubview:self.titleLabel];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.contentView.mas_left).with.offset(kMargin);
make.top.mas_equalTo(self.contentView.mas_top);
make.right.mas_equalTo(self.contentView.mas_right).with.offset(-2 * kHalfMargin - 40);
make.height.mas_equalTo(kLabelHeight);
}];
self.downloadBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[self.downloadBtn setAdjustsImageWhenHighlighted:NO];
[self.downloadBtn setImageEdgeInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
[self.downloadBtn setImage:[UIImage imageNamed:@"audio_download"] forState:UIControlStateNormal];
[self.downloadBtn addTarget:self action:@selector(downloadBtnClick:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:self.downloadBtn];
[self.downloadBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(self.contentView.mas_right).with.offset(- kHalfMargin);
make.centerY.mas_equalTo(self.contentView.mas_centerY);
make.height.width.mas_equalTo(40);
}];
self.playAmountIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"audio_directory_readtime"]];
[self.contentView addSubview:self.playAmountIconView];
[self.playAmountIconView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.titleLabel.mas_left);
make.top.mas_equalTo(self.titleLabel.mas_bottom).with.offset(kHalfMargin);
make.height.mas_equalTo(12);
make.width.mas_equalTo(CGFLOAT_MIN);
make.bottom.mas_equalTo(self.contentView.mas_bottom).with.offset(- kMargin).priorityLow();
}];
self.playAmountLabel = [[UILabel alloc] init];
self.playAmountLabel.font = kFont11;
self.playAmountLabel.textColor = kGrayTextColor;
[self.contentView addSubview:self.playAmountLabel];
[self.playAmountLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.playAmountIconView.mas_right).with.offset(kQuarterMargin);
make.centerY.mas_equalTo(self.playAmountIconView.mas_centerY);
make.height.mas_equalTo(self.playAmountIconView.mas_height);
make.width.mas_equalTo(CGFLOAT_MIN);
}];
self.updateTimeIconView = [[UIImageView alloc] init];
self.updateTimeIconView.image = [UIImage imageNamed:@"audio_directory_updatetime"];
[self.contentView addSubview:self.updateTimeIconView];
[self.updateTimeIconView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.playAmountLabel.mas_right).with.offset(kHalfMargin);
make.centerY.mas_equalTo(self.playAmountLabel.mas_centerY);
make.height.mas_equalTo(self.playAmountIconView.mas_height);
make.width.mas_equalTo(CGFLOAT_MIN);
}];
self.updateTimeLabel = [[UILabel alloc] init];
self.updateTimeLabel.font = kFont11;
self.updateTimeLabel.textColor = kGrayTextColor;
[self.contentView addSubview:self.updateTimeLabel];
[self.updateTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.updateTimeIconView.mas_right).with.offset(kQuarterMargin);
make.right.mas_equalTo(self.downloadBtn.mas_left);
make.centerY.mas_equalTo(self.updateTimeIconView.mas_centerY);
make.height.mas_equalTo(self.updateTimeIconView.mas_height);
}];
}
- (void)setAudioDirectoryModel:(TFProductionChapterModel *)audioDirectoryModel
{
if (_audioDirectoryModel != audioDirectoryModel) {
_audioDirectoryModel = audioDirectoryModel;
self.titleLabel.text = audioDirectoryModel.chapter_title ? : @"";
if (audioDirectoryModel.play_num > 0) {
self.playAmountIconView.hidden = NO;
[self.playAmountIconView mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(12);
}];
self.playAmountLabel.text = audioDirectoryModel.play_num ? : @"";
self.playAmountLabel.hidden = NO;
[self.playAmountLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo([TFViewHelper getDynamicWidthWithLabel:self.playAmountLabel]);
}];
} else {
self.playAmountIconView.hidden = YES;
[self.playAmountIconView mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.titleLabel.mas_left);
make.width.mas_equalTo(CGFLOAT_MIN);
}];
self.playAmountLabel.hidden = YES;
[self.playAmountLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.playAmountIconView.mas_right);
make.width.mas_equalTo(CGFLOAT_MIN);
}];
}
if (audioDirectoryModel.update_time.length > 0) {
self.updateTimeIconView.hidden = NO;
[self.updateTimeIconView mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(12);
}];
self.updateTimeLabel.text = audioDirectoryModel.update_time ? : @"";
self.updateTimeLabel.hidden = NO;
} else {
self.updateTimeIconView.hidden = YES;
[self.updateTimeIconView mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(CGFLOAT_MIN);
}];
self.updateTimeLabel.hidden = YES;
}
}
if ([[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeAudio] isCurrentPlayingChapterWithProduction_id:audioDirectoryModel.production_id chapter_id:audioDirectoryModel.chapter_id] &&
[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeAudio] isCurrentPlayingProductionWithProduction_id:audioDirectoryModel.production_id]) {
self.titleLabel.textColor = kMainColor;
} else if ([[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeAudio] chapterHasReadedWithProduction_id:audioDirectoryModel.production_id chapter_id:audioDirectoryModel.chapter_id]) {
self.titleLabel.textColor = kGrayTextColor;
} else {
self.titleLabel.textColor = kBlackColor;
}
[self changeDownloadButtonState];
}
- (void)setCellDownloadState:(WXYZ_ProductionDownloadState)cellDownloadState
{
if (_cellDownloadState != cellDownloadState) {
_cellDownloadState = cellDownloadState;
[self changeDownloadButtonState];
}
}
- (void)changeDownloadButtonState
{
switch (_cellDownloadState) {
case WXYZ_ProductionDownloadStateNormal: {
if (self.audioDirectoryModel.is_preview == 1) {
[self.downloadBtn setImage:[UIImage imageNamed:TFLocalizedString(@"audio_download_vip")] forState:UIControlStateNormal];
} else {
[self.downloadBtn setImage:[UIImage imageNamed:@"audio_download"] forState:UIControlStateNormal];
}
}
break;
case WXYZ_ProductionDownloadStateDownloading: {
[self.downloadBtn setImage:[UIImage imageNamed:@"audio_downloading"] forState:UIControlStateNormal];
}
break;
case WXYZ_ProductionDownloadStateDownloaded: {
[self.downloadBtn setImage:[UIImage imageNamed:@"audio_downloaded"] forState:UIControlStateNormal];
}
break;
case WXYZ_ProductionDownloadStateFail: {
[self.downloadBtn setImage:[UIImage imageNamed:@"audio_download_fail"] forState:UIControlStateNormal];
}
break;
default:
break;
}
}
- (void)downloadBtnClick:(UIButton *)sender
{
if (([[WXYZ_AudioDownloadManager sharedManager] getChapterDownloadStateWithProduction_id:self.audioDirectoryModel.production_id chapter_id:self.audioDirectoryModel.chapter_id] == WXYZ_ProductionDownloadStateDownloading) || ([[WXYZ_AudioDownloadManager sharedManager] getChapterDownloadStateWithProduction_id:self.audioDirectoryModel.production_id chapter_id:self.audioDirectoryModel.chapter_id] == WXYZ_ProductionDownloadStateDownloaded)) {
return;
}
if (self.downloadChapterBlock) {
self.downloadChapterBlock(self.audioDirectoryModel.production_id, self.audioDirectoryModel.chapter_id, self.index);
}
}
@end
@@ -0,0 +1,24 @@
//
// TFAudioRecommendedViewCell.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TFProductionListViewCell.h"
NS_ASSUME_NONNULL_BEGIN
@class TFAudioContentModel;
@interface TFAudioRecommendedViewCell : TFProductionListViewCell
@property (nonatomic ,copy) void(^clickBlock)(NSInteger production_id);
- (void)setListModel:(TFAudioContentModel *)listModel;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,107 @@
//
// TFAudioRecommendedViewCell.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/25.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFAudioRecommendedViewCell.h"
#import "TFCollectionManager.h"
#import "TFAudioRecommendedModel.h"
@interface TFAudioRecommendedViewCell ()
@property (nonatomic ,strong) UILabel *playAmountLabel;
@property (nonatomic ,strong) UIButton *collectionBtn;
@end
@implementation TFAudioRecommendedViewCell
- (void)createSubviews
{
[super createSubviews];
self.tagboardView.hidden = YES;
self.authorLabel.textColor = kMainColor;
UIImageView *playAmountIconView = [[UIImageView alloc] init];
playAmountIconView.image = [UIImage imageNamed:@"audio_directory_readtime"];
[self.contentView addSubview:playAmountIconView];
[playAmountIconView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.authorLabel.mas_right).with.offset(kHalfMargin);
make.centerY.mas_equalTo(self.authorLabel.mas_centerY);
make.height.mas_equalTo(10);
make.width.mas_equalTo(10);
}];
self.playAmountLabel = [[UILabel alloc] init];
self.playAmountLabel.font = kFont12;
self.playAmountLabel.textColor = kGrayTextColor;
[self.contentView addSubview:self.playAmountLabel];
[self.playAmountLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(playAmountIconView.mas_right).with.offset(kQuarterMargin);
make.centerY.mas_equalTo(playAmountIconView.mas_centerY);
make.height.mas_equalTo(30);
make.width.mas_equalTo(CGFLOAT_MIN);
}];
self.collectionBtn = [UIButton buttonWithType:UIButtonTypeCustom];
self.collectionBtn.layer.cornerRadius = 10;
self.collectionBtn.layer.borderColor = kMainColor.CGColor;
self.collectionBtn.layer.borderWidth = 0.4;
[self.collectionBtn addTarget:self action:@selector(collectionBtnClick:) forControlEvents:UIControlEventTouchUpInside];
[self.collectionBtn setTitle:TFLocalizedString(@"收藏") forState:UIControlStateNormal];
[self.collectionBtn setTitleColor:kMainColor forState:UIControlStateNormal];
[self.collectionBtn.titleLabel setFont:kFont11];
[self.contentView addSubview:self.collectionBtn];
[self.collectionBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(self.contentView.mas_right).with.offset(- kHalfMargin);
make.centerY.mas_equalTo(playAmountIconView.mas_centerY);
make.width.mas_equalTo(60);
make.height.mas_equalTo(20);
}];
}
- (void)setListModel:(TFAudioContentModel *)listModel
{
[super setProductionModel:listModel];
self.authorLabel.text = listModel.finished ? : @"";
[self.authorLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo([TFViewHelper getDynamicWidthWithLabel:self.authorLabel]);
}];
self.playAmountLabel.text = [NSString stringWithFormat:@"%zd", listModel.total_views];
[self.playAmountLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo([TFViewHelper getDynamicWidthWithLabel:self.playAmountLabel]);
}];
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeAudio] isCollectedWithProduction_id:self.productionModel.production_id]) {
[self.collectionBtn setTitle:TFLocalizedString(@"已收藏") forState:UIControlStateNormal];
} else {
[self.collectionBtn setTitle:TFLocalizedString(@"收藏") forState:UIControlStateNormal];
}
}
- (void)collectionBtnClick:(UIButton *)sender
{
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeAudio] isCollectedWithProduction_id:self.productionModel.production_id]) {
return;
}
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeAudio] addCollectionWithProductionModel:self.productionModel]) {
[self.collectionBtn setTitle:TFLocalizedString(@"已收藏") forState:UIControlStateNormal];
[TFPromptManager showPromptViewWithStatus:TFPromptStatusSuccess promptTitle:TFLocalizedString(@"已加入书架")];
} else {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"加入书架失败")];
}
[TFUtilsHelper synchronizationRackProductionWithProduction_id:self.productionModel.production_id productionType:TFProductionTypeAudio complete:nil];
}
@end
@@ -0,0 +1,24 @@
//
// TFComicDetailLeftViewController.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TFComicDetailModel.h"
NS_ASSUME_NONNULL_BEGIN
typedef void(^PushToComicDetailBlock)(NSInteger production_id);
@interface TFComicDetailLeftViewController : TFBasicViewController
@property (nonatomic ,assign) BOOL canScroll;
@property (nonatomic ,strong) TFComicDetailModel *detailModel;
@property (nonatomic ,copy) PushToComicDetailBlock pushToComicDetailBlock;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,341 @@
//
// TFComicDetailLeftViewController.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicDetailLeftViewController.h"
#import "TFCommentsViewController.h"
#import "TFComicDetailIntroductionCell.h"
#import "TFCommentsViewCell.h"
#import "TFBookStoreComicNormalStyleCell.h"
#import "TFPublicAdvertisementViewCell.h"
@interface TFComicDetailLeftViewController ()<UITableViewDelegate, UITableViewDataSource>
@property (nonatomic ,strong) UIButton *sectionBottomCommentButton;
@property (nonatomic ,strong) NSArray *sectionTagArray;
@end
@implementation TFComicDetailLeftViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self initialize];
[self createSubviews];
}
- (void)initialize
{
[self hiddenNavigationBar:YES];
self.view.backgroundColor = [UIColor whiteColor];
}
- (void)createSubviews
{
self.mainTableViewGroup.delegate = self;
self.mainTableViewGroup.dataSource = self;
[self.view addSubview:self.mainTableViewGroup];
[self.mainTableViewGroup mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view);
}];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (!self.canScroll) {
scrollView.contentOffset = CGPointZero;
}
if (scrollView.contentOffset.y <= 0) {
self.canScroll = NO;
scrollView.contentOffset = CGPointZero;
//到顶通知父视图改变状态
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Can_Leave_Top object:@YES];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Can_Leave_Top object:@NO];
}
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSMutableArray *t_sectionTagArray = [NSMutableArray array];
// 简介
if (self.detailModel.productionModel.production_descirption.length > 0) {
[t_sectionTagArray addObject:@"descirption"];
}
// 广告
if (self.detailModel.advert.ad_type != 0) {
[t_sectionTagArray addObject:@"ad"];
}
// 评论
#if TF_Comments_Mode
[t_sectionTagArray addObject:@"comment"];
#endif
// 猜你喜欢
if (self.detailModel.label.count > 0) {
[t_sectionTagArray addObject:@"label"];
}
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.detailModel.comment.count;
}
#endif
if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"label"]) {
return self.detailModel.label.count;
}
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([[self.sectionTagArray objectAtIndex:indexPath.section] isEqualToString:@"descirption"]) {
return [self createIntroductionStyleCellWithTableView:tableView indexPath:indexPath labelModel:self.detailModel.productionModel];
}
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"]) {
TFCommentsListModel *commentModel = [self.detailModel.comment objectOrNilAtIndex:indexPath.row];
return [self createCommentCellWithTableView:tableView indexPath:indexPath labelModel:commentModel];
}
#endif
if ([[self.sectionTagArray objectAtIndex:indexPath.section] isEqualToString:@"label"]) {
TFBookStoreLabelModel *labelModel = [self.detailModel.label objectOrNilAtIndex:indexPath.row];
return [self createNormalStyleComicCellWithTableView:tableView indexPath:indexPath labelModel:labelModel];
}
return [[UITableViewCell alloc] init];
}
- (UITableViewCell *)createIntroductionStyleCellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath labelModel:(TFProductionModel *)comicModel
{
static NSString *cellName = @"TFComicDetailIntroductionCell";
TFComicDetailIntroductionCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
if (!cell) {
cell = [[TFComicDetailIntroductionCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellName];
}
cell.comicModel = comicModel;
return cell;
}
- (UITableViewCell *)createNormalStyleComicCellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath labelModel:(TFBookStoreLabelModel *)labelModel
{
WS(weakSelf)
static NSString *cellName = @"TFBookStoreComicNormalStyleCell";
TFBookStoreComicNormalStyleCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
if (!cell) {
cell = [[TFBookStoreComicNormalStyleCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellName];
}
cell.labelModel = labelModel;
cell.cellDidSelectItemBlock = ^(NSInteger production_id) {
if (weakSelf.pushToComicDetailBlock) {
weakSelf.pushToComicDetailBlock(production_id);
}
};
return cell;
}
- (UITableViewCell *)createCommentCellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath labelModel:(TFCommentsListModel *)commentModel
{
static NSString *cellName = @"TFCommentsViewCell";
TFCommentsViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
if (!cell) {
cell = [[TFCommentsViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellName];
}
cell.commentModel = commentModel;
[cell setIsPreview:YES lastRow:(self.detailModel.comment.count - 1 == indexPath.row)];
cell.hiddenEndLine = NO;
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.detailModel.advert refresh:NO];
cell.mainTableView = tableView;
return cell;
}
//section头部间距
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
#if TF_Comments_Mode
if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"comment"]) {
return 54;
}
#endif
return CGFLOAT_MIN;
}
//section头部视图
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, CGFLOAT_MIN)];
view.backgroundColor = kWhiteColor;
if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"comment"]) {
view.frame = CGRectMake(0, 0, SCREEN_WIDTH, 54);
if (self.detailModel.advert.ad_type == 0) {
UIView *grayLine = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 10)];
grayLine.backgroundColor = kGrayViewColor;
[view addSubview:grayLine];
}
UIImageView *mainTitleHoldView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"comic_label_hold"]];
mainTitleHoldView.frame = CGRectMake(kHalfMargin, 10 + 22 - kMargin / 2, kMargin, kMargin);
[view addSubview:mainTitleHoldView];
UILabel *t_title = [[UILabel alloc] initWithFrame:CGRectMake(kMargin + kHalfMargin + kQuarterMargin, 10, SCREEN_WIDTH - kMargin, 44)];
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];
[view addSubview:t_title];
UIButton *commentButton = [UIButton buttonWithType:UIButtonTypeCustom];
CGFloat width = [TFViewHelper getDynamicWidthWithLabelFont:kFont12 labelHeight:43.0 labelText:TFLocalizedString(@"写评论") maxWidth:SCREEN_WIDTH / 2.0 - kMargin];
commentButton.frame = CGRectMake(SCREEN_WIDTH - width - kHalfMargin, 10, width, 43);
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];
[view addSubview:commentButton];
}
return view;
}
//section底部间距
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
#if TF_Comments_Mode
if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"comment"]) {
return 64;
}
#endif
return CGFLOAT_MIN;
}
//section底部视图
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, CGFLOAT_MIN)];
view.backgroundColor = kWhiteColor;
if ([[self.sectionTagArray objectAtIndex:section] isEqualToString:@"comment"]) {
if (self.detailModel.productionModel.total_comment == 0) {
[self.sectionBottomCommentButton setTitle:TFLocalizedString(@"暂无评论,点击抢沙发") forState:UIControlStateNormal];
} else {
[self.sectionBottomCommentButton setTitle:[NSString stringWithFormat:@"%@(%@%@)", TFLocalizedString(@"查看全部评论"), [TFUtilsHelper formatStringWithInteger:self.detailModel.productionModel.total_comment], TFLocalizedString(@"")] forState:UIControlStateNormal];
}
[view addSubview:self.sectionBottomCommentButton];
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.sectionBottomCommentButton.frame) + kHalfMargin, SCREEN_WIDTH, 10)];
lineView.backgroundColor = kGrayViewColor;
[view addSubview:lineView];
}
return view;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([[self.sectionTagArray objectAtIndex:indexPath.section] isEqualToString:@"comment"]) {
[self commentWithComment_id:[[self.detailModel.comment objectOrNilAtIndex:indexPath.row] comment_id]];
}
}
- (void)commentClick
{
[self commentWithComment_id:0];
}
- (void)commentWithComment_id:(NSInteger)comment_id
{
WS(weakSelf)
TFCommentsViewController *vc = [[TFCommentsViewController alloc] init];
vc.production_id = self.detailModel.productionModel.production_id;
vc.comment_id = comment_id;
vc.productionType = TFProductionTypeComic;
vc.commentsSuccessBlock = ^(TFCommentsListModel *commentModel) {
NSMutableArray *array = [weakSelf.detailModel.comment mutableCopy];
[array insertObject:commentModel atIndex:0];
weakSelf.detailModel.comment = [array copy];
weakSelf.detailModel.productionModel.total_comment ++;
[weakSelf.mainTableViewGroup reloadData];
};
[self.navigationController pushViewController:vc animated:YES];
}
- (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)setDetailModel:(TFComicDetailModel *)detailModel
{
_detailModel = detailModel;
[self.mainTableViewGroup reloadData];
}
@end
@@ -0,0 +1,21 @@
//
// TFComicDetailRightViewController.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface TFComicDetailRightViewController : TFBasicViewController
@property (nonatomic ,assign) BOOL canScroll;
@property (nonatomic ,assign) CGFloat contentOffSetY;
@property (nonatomic ,strong) TFProductionModel *comicModel;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,342 @@
//
// TFComicDetailRightViewController.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicDetailRightViewController.h"
#import "TFComicDetailRightViewCell.h"
#import "TFComicBrowseViewController.h"
#import "TFReadRecordManager.h"
#define MenuButtonHeight 50
@interface TFComicDetailRightViewController ()<UITableViewDelegate, UITableViewDataSource>
{
TFButton *gotoCurrent;
TFButton *gotoEnd;
CGFloat beginOffSetY;
BOOL clickGotoButton;
}
@property (nonatomic, strong) UILabel *headTitleLabel;
@property (nonatomic, strong) TFButton *sortButton;
/// 已阅读章节索引
@property (nonatomic, assign) NSInteger readIndex;
@end
@implementation TFComicDetailRightViewController
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.mainTableView reloadData];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self initialize];
[self createSubviews];
}
- (void)initialize
{
// 计算已读章节的位置
NSInteger readIndex = [[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] getReadingRecordChapter_idWithProduction_id:self.comicModel.production_id];
NSArray<NSNumber *> *t_arr = [self.comicModel.chapter_list valueForKeyPath:@"chapter_id"];
self.readIndex = [t_arr indexOfObject:@(readIndex)];
if (self.readIndex == NSNotFound) {
self.readIndex = -1;
}
[self hiddenNavigationBar:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadRecordData) name:NSNotification_Updata_Read_Record object:nil];
}
- (void)createSubviews
{
self.mainTableView.delegate = self;
self.mainTableView.dataSource = self;
[self.view addSubview:self.mainTableView];
[self.mainTableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view);
}];
gotoCurrent = [[TFButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - MenuButtonHeight - kHalfMargin, SCREEN_HEIGHT - Comic_Detail_HeaderView_Height - PUB_TABBAR_HEIGHT - 44 - 44 - MenuButtonHeight - kMargin - kHalfMargin, MenuButtonHeight, MenuButtonHeight) buttonTitle:TFLocalizedString(@"当前") buttonImageName:@"comic_goto_current" buttonIndicator:TFButtonIndicatorTitleBottom];
gotoCurrent.layer.cornerRadius = 25;
gotoCurrent.layer.borderWidth = 1;
gotoCurrent.layer.borderColor = kGrayViewColor.CGColor;
gotoCurrent.clipsToBounds = YES;
gotoCurrent.backgroundColor = kWhiteColor;
gotoCurrent.buttonMargin = 8;
gotoCurrent.buttonTitleFont = kFont10;
gotoCurrent.graphicDistance = 0;
gotoCurrent.buttonImageScale = 0.4;
[gotoCurrent addTarget:self action:@selector(gotoCurrentClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:gotoCurrent];
gotoEnd = [[TFButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - MenuButtonHeight - kHalfMargin, SCREEN_HEIGHT - Comic_Detail_HeaderView_Height - PUB_TABBAR_HEIGHT - 44 - 44 - kMargin, MenuButtonHeight, MenuButtonHeight) buttonTitle:TFLocalizedString(@"到底") buttonImageName:@"comic_goto_bottom" buttonIndicator:TFButtonIndicatorTitleBottom];
gotoEnd.layer.cornerRadius = 25;
gotoEnd.layer.borderWidth = 1;
gotoEnd.layer.borderColor = kGrayViewColor.CGColor;
gotoEnd.clipsToBounds = YES;
gotoEnd.tag = 0;
gotoEnd.backgroundColor = kWhiteColor;
gotoEnd.buttonMargin = 8;
gotoEnd.buttonTitleFont = kFont10;
gotoEnd.graphicDistance = 0;
gotoEnd.buttonImageScale = 0.4;
[gotoEnd addTarget:self action:@selector(gotoEndClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:gotoEnd];
[self setEmptyOnView:self.mainTableView title:TFLocalizedString(@"暂无目录列表") buttonTitle:@"" tapBlock:^{}];
if (self.comicModel.chapter_list.count == 0) {
gotoCurrent.hidden = YES;
gotoEnd.hidden = YES;
self.sortButton.hidden = YES;
self.headTitleLabel.hidden = YES;
} else {
gotoCurrent.hidden = NO;
gotoEnd.hidden = NO;
self.sortButton.hidden = NO;
self.headTitleLabel.hidden = NO;
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.mainTableView xtfei_endLoading];
});
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
beginOffSetY = scrollView.contentOffset.y;
clickGotoButton = NO;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (!clickGotoButton) {
if ([scrollView isEqual:self.mainTableView]) {
if (!self.canScroll) {
scrollView.contentOffset = CGPointZero;
}
if (scrollView.contentOffset.y <= 0) {
self.canScroll = NO;
scrollView.contentOffset = CGPointZero;
//到顶通知父视图改变状态
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Can_Leave_Top object:@YES];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Can_Leave_Top object:@NO];
}
}
if (scrollView.contentOffset.y > beginOffSetY) {
gotoEnd.buttonImageName = @"comic_goto_bottom";
gotoEnd.buttonTitle = TFLocalizedString(@"到底");
gotoEnd.tag = 0;
} else if (scrollView.contentOffset.y < beginOffSetY) {
gotoEnd.buttonImageName = @"comic_goto_top";
gotoEnd.buttonTitle = TFLocalizedString(@"到顶");
gotoEnd.tag = 1;
}
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if (scrollView.contentSize.height - scrollView.contentOffset.y <= CGRectGetHeight(scrollView.bounds)) {// 滑到了底部
gotoEnd.buttonImageName = @"comic_goto_top";
gotoEnd.buttonTitle = TFLocalizedString(@"到顶");
gotoEnd.tag = 1;
} else if (scrollView.contentOffset.y == 0) {// 滑到了顶部
gotoEnd.buttonImageName = @"comic_goto_bottom";
gotoEnd.buttonTitle = TFLocalizedString(@"到底");
gotoEnd.tag = 0;
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (!decelerate) {
if (scrollView.contentSize.height - scrollView.contentOffset.y <= CGRectGetHeight(scrollView.bounds)) {// 滑到了底部
gotoEnd.buttonImageName = @"comic_goto_top";
gotoEnd.buttonTitle = TFLocalizedString(@"到顶");
gotoEnd.tag = 1;
} else if (scrollView.contentOffset.y == 0) {// 滑到了顶部
gotoEnd.buttonImageName = @"comic_goto_bottom";
gotoEnd.buttonTitle = TFLocalizedString(@"到底");
gotoEnd.tag = 0;
}
}
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
if (scrollView.contentSize.height - scrollView.contentOffset.y <= CGRectGetHeight(scrollView.bounds)) {// 滑到了底部
gotoEnd.buttonImageName = @"comic_goto_top";
gotoEnd.buttonTitle = TFLocalizedString(@"到顶");
gotoEnd.tag = 1;
} else if (scrollView.contentOffset.y == 0) {// 滑到了顶部
gotoEnd.buttonImageName = @"comic_goto_bottom";
gotoEnd.buttonTitle = TFLocalizedString(@"到底");
gotoEnd.tag = 0;
}
}
- (void)setContentOffSetY:(CGFloat)contentOffSetY
{
gotoCurrent.frame = CGRectMake(SCREEN_WIDTH - MenuButtonHeight - kHalfMargin, SCREEN_HEIGHT - Comic_Detail_HeaderView_Height - PUB_TABBAR_HEIGHT - 44 - 44 - MenuButtonHeight - kMargin - kHalfMargin + contentOffSetY, MenuButtonHeight, MenuButtonHeight);
gotoEnd.frame = CGRectMake(SCREEN_WIDTH - MenuButtonHeight - kHalfMargin, SCREEN_HEIGHT - Comic_Detail_HeaderView_Height - PUB_TABBAR_HEIGHT - 44 - 44 - kMargin + contentOffSetY, MenuButtonHeight, MenuButtonHeight);
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.comicModel.chapter_list.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
TFProductionChapterModel *t_chapterList = [self.comicModel.chapter_list objectOrNilAtIndex:indexPath.row];
TFComicDetailRightViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TFComicDetailRightViewCell"];
if (!cell) {
cell = [[TFComicDetailRightViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TFComicDetailRightViewCell"];
}
cell.chapterModel = t_chapterList;
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 44;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 44)];
view.backgroundColor = [UIColor whiteColor];
[view addSubview:self.headTitleLabel];
[view addSubview:self.sortButton];
return view;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.readIndex = indexPath.row;
TFProductionChapterModel *t_chapterModel = [self.comicModel.chapter_list objectOrNilAtIndex:indexPath.row];
[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] addReadingRecordWithProduction_id:t_chapterModel.production_id chapter_id:t_chapterModel.chapter_id chapterTitle:t_chapterModel.chapter_title];
TFComicBrowseViewController *vc = [[TFComicBrowseViewController alloc] init];
vc.comicProductionModel = self.comicModel;
vc.chapter_id = t_chapterModel.chapter_id;
[self.navigationController pushViewController:vc animated:YES];
}
#pragma mark - 点击事件
- (void)changeDirectorySort:(TFButton *)sender
{
if (self.comicModel.chapter_list.count == 0) return;
if (sender.tag == 0) {
sender.tag = 1;
sender.buttonImageName = @"comic_reverse_order";
sender.buttonTitle = TFLocalizedString(@"倒序");
} else {
sender.tag = 0;
sender.buttonImageName = @"comic_positive_order";
sender.buttonTitle = TFLocalizedString(@"正序");
}
self.comicModel.chapter_list = [[self.comicModel.chapter_list reverseObjectEnumerator] allObjects];
// 计算已读章节的位置
NSInteger readIndex = [[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] getReadingRecordChapter_idWithProduction_id:self.comicModel.production_id];
NSArray<NSNumber *> *t_arr = [self.comicModel.chapter_list valueForKeyPath:@"chapter_id"];
self.readIndex = [t_arr indexOfObject:@(readIndex)];
if (self.readIndex == NSNotFound) {
self.readIndex = -1;
}
[self.mainTableView reloadData];
}
- (void)gotoCurrentClick:(UIButton *)sender
{
if (self.comicModel.chapter_list.count == 0) return;
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Directory_Move object:@"bottom"];
if (self.readIndex != -1) {
[self.mainTableView scrollToRow:self.readIndex inSection:0 atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
}
- (void)gotoEndClick:(UIButton *)sender
{
if (self.comicModel.chapter_list.count == 0) return;
clickGotoButton = YES;
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Can_Leave_Top object:@NO];
if (sender.tag == 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Directory_Move object:@"bottom"];
[self.mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.comicModel.chapter_list.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
gotoEnd.buttonImageName = @"comic_goto_top";
gotoEnd.buttonTitle = TFLocalizedString(@"到顶");
gotoEnd.tag = 1;
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Directory_Move object:@"top"];
[self.mainTableView setContentOffset:CGPointMake(0,0) animated:YES];
gotoEnd.buttonImageName = @"comic_goto_bottom";
gotoEnd.buttonTitle = TFLocalizedString(@"到底");
gotoEnd.tag = 0;
}
}
#pragma mark - 懒加载
- (UILabel *)headTitleLabel
{
if (!_headTitleLabel) {
_headTitleLabel = [[UILabel alloc] init];
_headTitleLabel.text = self.comicModel.flag?:@"";
_headTitleLabel.frame = CGRectMake(kHalfMargin, 0, SCREEN_WIDTH - kMargin, 44);
_headTitleLabel.font = kFont11;
_headTitleLabel.textColor = kGrayTextColor;
_headTitleLabel.textAlignment = NSTextAlignmentLeft;
}
return _headTitleLabel;
}
- (TFButton *)sortButton
{
if (!_sortButton) {
CGFloat width = [TFViewHelper getDynamicWidthWithLabelFont:kFont11 labelHeight:30.0 labelText:TFLocalizedString(@"正序") maxWidth:SCREEN_WIDTH / 2.0 - kMargin];
width += kLabelHeight;
_sortButton = [[TFButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - kHalfMargin - width, 7, width, 30) buttonTitle:TFLocalizedString(@"正序") buttonSubTitle:@"" buttonImageName:@"comic_positive_order" buttonIndicator:TFButtonIndicatorImageRightBothRight showMaskView:NO];
_sortButton.buttonImageScale = 0.4;
_sortButton.buttonTitleFont = kFont11;
_sortButton.graphicDistance = 5;
_sortButton.buttonTitleColor = kGrayTextColor;
_sortButton.tag = 0;
[_sortButton addTarget:self action:@selector(changeDirectorySort:) forControlEvents:UIControlEventTouchUpInside];
}
return _sortButton;
}
- (void)setComicModel:(TFProductionModel *)comicModel
{
_comicModel = comicModel;
if (self.sortButton.tag == 1) {
self.comicModel.chapter_list = [[comicModel.chapter_list reverseObjectEnumerator] allObjects];
}
[self reloadRecordData];
}
- (void)reloadRecordData
{
[self.mainTableView reloadData];
}
@end
@@ -0,0 +1,22 @@
//
// TFComicDetailViewController.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TFBasicViewController.h"
NS_ASSUME_NONNULL_BEGIN
#define Comic_Detail_HeaderView_Height (round(SCREEN_WIDTH * 0.8) - 50.0)
@interface TFComicDetailViewController : TFBasicViewController
@property (nonatomic ,assign) NSInteger comic_id;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,435 @@
//
// TFComicDetailViewController.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicDetailViewController.h"
#import "TFComicBrowseViewController.h"
#import "TFComicDownloadViewController.h"
#import "TFTaskViewController.h"
#import "TFComicDetailHeaderView.h"
#import "TFComicDetailFooterView.h"
#import "WXYZ_CompositeEmbeddedTableView.h"
#import "TFComicDetailModel.h"
#import "TFComicCatalogueModel.h"
#import "TFReadRecordManager.h"
#import "TFShareManager.h"
#import "WXYZ_DownloadHelper.h"
@interface TFComicDetailViewController ()<UITableViewDelegate, UITableViewDataSource>
{
UIButton *menuButton;
UILabel *menuTitle;
}
@property (nonatomic ,assign) BOOL canScroll;
// 是否到顶 到底
@property (nonatomic ,assign) BOOL isAutoScroll;
@property (nonatomic ,strong) UIView *bottomMenuBar;
@property (nonatomic ,strong) UIButton *shareButton;
@property (nonatomic ,strong) UIButton *downloadButton;
@property (nonatomic ,strong) TFComicDetailHeaderView *headerView;
@property (nonatomic ,strong) TFComicDetailFooterView *footerView;
@property (nonatomic ,strong) TFComicDetailModel *comicDetailModel;
@property (nonatomic ,strong) WXYZ_CompositeEmbeddedTableView *mallTableView;
@end
@implementation TFComicDetailViewController
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Hidden_Tabbar object:nil];
[self setStatusBarLightContentStyle];
[self reloadToolBarState];
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Hidden_Tabbar object:nil];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self initialize];
[self createSubviews];
[self netRequest];
}
- (void)initialize
{
[self hiddenSeparator];
self.navigationBar.backgroundColor = [UIColor clearColor];
self.navigationBar.navTitleLabel.alpha = 0;
self.navigationBar.navTitleLabel.textColor = kWhiteColor;
[self.navigationBar setLightLeftButton];
self.shareButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.shareButton.adjustsImageWhenHighlighted = NO;
self.shareButton.tintColor = kWhiteColor;
self.shareButton.hidden = YES;
[self.shareButton setImage:[[UIImage imageNamed:@"comic_share"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal];
[self.shareButton setImageEdgeInsets:UIEdgeInsetsMake(4, 4, 3, 3)];
[self.shareButton addTarget:self action:@selector(shareButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.navigationBar addSubview:self.shareButton];
[self.shareButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(self.view.mas_right).with.offset(- kMargin);
make.centerY.mas_equalTo(self.navigationBar.navTitleLabel.mas_centerY);
make.width.height.mas_equalTo(30);
}];
#if TF_Download_Mode
self.downloadButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.downloadButton.adjustsImageWhenHighlighted = NO;
self.downloadButton.tintColor = kWhiteColor;
self.downloadButton.hidden = YES;
[self.downloadButton setImage:[[UIImage imageNamed:@"comic_download"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal];
[self.downloadButton setImageEdgeInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
[self.downloadButton addTarget:self action:@selector(downloadButtonClick) forControlEvents:UIControlEventTouchUpInside];
[self.navigationBar addSubview:self.downloadButton];
[self.downloadButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(self.shareButton.mas_left).with.offset(- kHalfMargin);
make.centerY.mas_equalTo(self.navigationBar.navTitleLabel.mas_centerY);
make.width.height.mas_equalTo(30);
}];
#endif
self.canScroll = YES;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeScrollStatus:) name:Notification_Can_Leave_Top object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollMove:) name:Notification_Directory_Move object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(catalogRequest) name:Notification_Production_Pay_Success object:nil];
}
- (void)createSubviews
{
self.mallTableView = [[WXYZ_CompositeEmbeddedTableView alloc] initWithFrame:CGRectMake(1, 1, 1, 1) style:UITableViewStylePlain];
self.mallTableView.delegate = self;
self.mallTableView.dataSource = self;
[self.mallTableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
[self.view addSubview:self.mallTableView];
[self.mallTableView 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);
}];
self.headerView = [[TFComicDetailHeaderView alloc] init];
self.headerView.frame = CGRectMake(0, 0, SCREEN_WIDTH, Comic_Detail_HeaderView_Height);
[self.mallTableView setTableHeaderView:self.headerView];
[self.headerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(0);
make.top.mas_equalTo(0);
make.width.mas_equalTo(SCREEN_WIDTH);
make.height.mas_equalTo(Comic_Detail_HeaderView_Height);
}];
WS(weakSelf)
self.footerView = [[TFComicDetailFooterView alloc] init];
self.footerView.view.hidden = YES;
self.footerView.view.frame = CGRectMake(0, Comic_Detail_HeaderView_Height, SCREEN_WIDTH, SCREEN_HEIGHT - (Comic_Detail_HeaderView_Height));
self.footerView.pushToComicDetailBlock = ^(NSInteger production_id) {
TFComicDetailViewController *vc = [[TFComicDetailViewController alloc] init];
vc.comic_id = production_id;
[weakSelf.navigationController pushViewController:vc animated:YES];
};
[self.mallTableView setTableFooterView:self.footerView.view];
[self addChildViewController:self.footerView];
self.bottomMenuBar = [[UIView alloc] init];
self.bottomMenuBar.hidden = YES;
self.bottomMenuBar.backgroundColor = kGrayViewColor;
[self.view addSubview:self.bottomMenuBar];
[self.bottomMenuBar 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);
}];
menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
menuButton.backgroundColor = kMainColor;
[menuButton setTitle:TFLocalizedString(@"开始阅读") forState:UIControlStateNormal];
[menuButton setTitleColor:kWhiteColor forState:UIControlStateNormal];
[menuButton.titleLabel setFont:[UIFont boldSystemFontOfSize:kFontSize13]];
[menuButton addTarget:self action:@selector(startReading) forControlEvents:UIControlEventTouchUpInside];
[self.bottomMenuBar addSubview:menuButton];
[menuButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(self.bottomMenuBar.mas_right);
make.top.mas_equalTo(0);
make.height.mas_equalTo(PUB_TABBAR_HEIGHT - PUB_TABBAR_OFFSET);
make.width.mas_equalTo(120);
}];
menuTitle = [[UILabel alloc] init];
menuTitle.textColor = kBlackColor;
menuTitle.textAlignment = NSTextAlignmentLeft;
menuTitle.font = kFont13;
[self.bottomMenuBar addSubview:menuTitle];
[menuTitle mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.top.mas_equalTo(0);
make.right.mas_equalTo(menuButton.mas_left);
make.height.mas_equalTo(PUB_TABBAR_HEIGHT - PUB_TABBAR_OFFSET);
}];
}
- (void)scrollMove:(NSNotification *)noti
{
self.isAutoScroll = YES;
if ([noti.object isEqualToString:@"top"]) {
self.footerView.canScroll = NO;
self.canScroll = YES;
self.mallTableView.contentOffset = CGPointMake(0, 0);
} else {
self.footerView.canScroll = YES;
self.canScroll = NO;
self.mallTableView.contentOffset = CGPointMake(0, Comic_Detail_HeaderView_Height - PUB_NAVBAR_HEIGHT);
}
}
- (void)changeScrollStatus:(NSNotification *)noti
{
self.canScroll = [noti.object boolValue];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
self.isAutoScroll = NO;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (self.isAutoScroll) {
return;
}
if (scrollView.contentOffset.y <= Comic_Detail_HeaderView_Height - PUB_NAVBAR_HEIGHT) {
if (self.canScroll) {
self.canScroll = YES;
self.footerView.canScroll = NO;
if (scrollView.contentOffset.y <= 0) {
scrollView.contentOffset = CGPointMake(0, 0);
}
} else {
scrollView.contentOffset = CGPointMake(0, Comic_Detail_HeaderView_Height - PUB_NAVBAR_HEIGHT);
}
} else {
self.canScroll = NO;
scrollView.contentOffset = CGPointMake(0, Comic_Detail_HeaderView_Height - PUB_NAVBAR_HEIGHT);
self.footerView.canScroll = YES;
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [[UITableViewCell alloc] init];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return CGFLOAT_MIN;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return CGFLOAT_MIN;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return CGFLOAT_MIN;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"contentOffset"]) {
CGPoint point = [((NSValue *)[self.mallTableView valueForKey:@"contentOffset"]) CGPointValue];
if (self.canScroll) {
self.footerView.contentOffSetY = point.y;
} else {
self.footerView.contentOffSetY = Comic_Detail_HeaderView_Height - PUB_NAVBAR_HEIGHT;
}
[self changeHeaderViewAlpha:point.y];
}
}
- (void)changeHeaderViewAlpha:(CGFloat)contentOffsetY
{
if (contentOffsetY >= 120) {
contentOffsetY = 120;
}
if (contentOffsetY <= 0) {
contentOffsetY = 0;
}
CGFloat viewAlpha = (120 - contentOffsetY) / 120;
self.headerView.headerViewAlpha = viewAlpha;
self.navigationBar.navTitleLabel.alpha = 1 - viewAlpha;
}
#pragma mark - 点击事件
#if TF_Download_Mode
- (void)downloadButtonClick
{
if (self.comicDetailModel.productionModel.chapter_list.count == 0) {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"章节正在更新中")];
return;
}
TFComicDownloadViewController *vc = [[TFComicDownloadViewController alloc] init];
vc.comicModel = self.comicDetailModel.productionModel;
[self.navigationController pushViewController:vc animated:YES];
}
#endif
- (void)shareButtonClick:(UIButton *)sender
{
NSInteger chapter_id = [[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] getReadingRecordChapter_idWithProduction_id:self.comic_id];
[TFShareManager shareWithProduction_id:NSStringFromInteger(self.comic_id) chapter_id:NSStringFromInteger(chapter_id) type:TFShareTypeComic];
}
- (void)startReading
{
if (self.comicDetailModel.productionModel.chapter_list.count == 0) {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"章节正在更新中")];
return;
}
[TFTaskViewController taskReadRequestWithProduction_id:self.comic_id];
TFComicBrowseViewController *vc = [[TFComicBrowseViewController alloc] init];
vc.comicProductionModel = self.comicDetailModel.productionModel;
vc.chapter_id = [[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] getReadingRecordChapter_idWithProduction_id:self.comic_id];
if (vc.chapter_id == 0) {// 如果没有阅读记录默认阅读第一章
TFProductionChapterModel *t_model = self.comicDetailModel.productionModel.chapter_list.firstObject;
if ([t_model.display_order isEqualToString:@"0"]) {// 判断一下目录的
vc.chapter_id = t_model.chapter_id;
} else {
vc.chapter_id = self.comicDetailModel.productionModel.chapter_list.lastObject.chapter_id;
}
}
[self.navigationController pushViewController:vc animated:YES];
}
- (void)reloadToolBarState
{
if ([[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] productionHasReadedWithProduction_id:self.comicDetailModel.productionModel.production_id]) {
menuTitle.text = [[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] getReadingRecordChapterTitleWithProduction_id:self.comicDetailModel.productionModel.production_id]?:@"";
[menuButton setTitle:TFLocalizedString(@"继续阅读") forState:UIControlStateNormal];
[menuButton mas_updateConstraints:^(MASConstraintMaker *make) {
if (menuButton.intrinsicContentSize.width + kMargin > 120.0) {
make.width.mas_equalTo(menuButton.intrinsicContentSize.width + kMargin);
} else {
make.width.mas_equalTo(120.0);
}
}];
} else {
if (self.comicDetailModel.productionModel.chapter_list.count > 0) {
TFProductionChapterModel *t_chapterList = [self.comicDetailModel.productionModel.chapter_list objectOrNilAtIndex:0];
menuTitle.text = t_chapterList.chapter_title?:@"";
} else {
menuTitle.text = self.comicDetailModel.productionModel.name?:@"";
}
[menuButton setTitle:TFLocalizedString(@"开始阅读") forState:UIControlStateNormal];
[menuButton mas_updateConstraints:^(MASConstraintMaker *make) {
if (menuButton.intrinsicContentSize.width + kMargin > 120.0) {
make.width.mas_equalTo(menuButton.intrinsicContentSize.width + kMargin);
} else {
make.width.mas_equalTo(120.0);
}
}];
}
[self.headerView reloadHeaderView];
}
- (void)netRequest
{
if ([TFNetworkManager networkingStatus] == NO) {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"当前无网络连接")];
return;
}
WS(weakSelf)
[TFNetworkTools POST:Comic_Detail parameters:@{@"comic_id":[TFUtilsHelper formatStringWithInteger:self.comic_id]} model:TFComicDetailModel.class success:^(BOOL isSuccess, TFComicDetailModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) {
if (isSuccess) {
[weakSelf.navigationBar setNavigationBarTitle:t_model.productionModel.name?:@""];
weakSelf.comicDetailModel = t_model;
}
weakSelf.bottomMenuBar.hidden = NO;
weakSelf.footerView.view.hidden = NO;
weakSelf.downloadButton.hidden = NO;
weakSelf.shareButton.hidden = NO;
[weakSelf catalogRequest];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[weakSelf catalogRequest];
}];
}
- (void)catalogRequest
{
WS(weakSelf)
[TFNetworkTools POST:Comic_Catalog parameters:@{@"comic_id":[TFUtilsHelper formatStringWithInteger:self.comic_id]} model:TFComicCatalogueModel.class success:^(BOOL isSuccess, TFComicCatalogueModel *_Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) {
if (isSuccess) {
weakSelf.comicDetailModel.productionModel.chapter_list = t_model.chapter_list;
weakSelf.headerView.comicProductionModel = weakSelf.comicDetailModel.productionModel;
weakSelf.footerView.detailModel = weakSelf.comicDetailModel;
// 存储作品信息
[[WXYZ_DownloadHelper sharedManager] recordDownloadProductionWithProductionModel:weakSelf.comicDetailModel.productionModel productionType:TFProductionTypeComic];
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf reloadToolBarState];
});
} else {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:requestModel.msg ?:TFLocalizedString(@"获取失败")];
}
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.mallTableView reloadData];
});
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[TFPromptManager showPromptWithError:error defaultText:TFLocalizedString(@"获取失败")];
}];
}
- (void)dealloc
{
@try {
[self.mallTableView removeObserver:self forKeyPath:@"contentOffset" context:NULL];
} @catch (NSException *exception) {
}
}
@end
@@ -0,0 +1,19 @@
//
// TFComicCatalogueModel.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface TFComicCatalogueModel : NSObject
@property (nonatomic ,strong) NSArray <TFProductionChapterModel *>*chapter_list;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,25 @@
//
// TFComicCatalogueModel.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicCatalogueModel.h"
@implementation TFComicCatalogueModel
+ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass
{
return @{@"chapter_list" : [TFProductionChapterModel class]};
}
+ (NSDictionary *)modelCustomPropertyMapper
{
return @{
@"production_id" : @[@"book_id", @"comic_id", @"audio_id"]
};
}
@end
@@ -0,0 +1,24 @@
//
// TFComicDetailModel.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class TFProductionModel, TFBookStoreLabelModel, TFCommentsListModel;
@interface TFComicDetailModel : NSObject
@property (nonatomic ,strong) TFProductionModel *productionModel;
@property (nonatomic ,strong) NSArray <TFCommentsListModel *>*comment;
@property (nonatomic ,strong) NSArray <TFBookStoreLabelModel *>*label;
@property (nonatomic ,strong) TFAdvertModel *advert;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,30 @@
//
// TFComicDetailModel.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicDetailModel.h"
#import "TFBookStoreLabelModel.h"
@implementation TFComicDetailModel
+ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass
{
return @{@"comment" : [TFCommentsListModel class],
@"label" : [TFBookStoreLabelModel class],
@"advert" : [TFAdvertModel class],
@"productionModel":[TFProductionModel class]
};
}
+ (NSDictionary *)modelCustomPropertyMapper
{
return @{
@"productionModel" :@"comic"
};
}
@end
@@ -0,0 +1,28 @@
//
// TFComicDetailFooterView.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TFComicDetailModel.h"
NS_ASSUME_NONNULL_BEGIN
typedef void(^PushToComicDetailBlock)(NSInteger production_id);
@interface TFComicDetailFooterView : TFBasicViewController
@property (nonatomic, strong) TFComicDetailModel *detailModel;
@property (nonatomic, assign) BOOL canScroll;
@property (nonatomic, assign) CGFloat contentOffSetY;
@property (nonatomic, copy) PushToComicDetailBlock pushToComicDetailBlock;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,89 @@
//
// TFComicDetailFooterView.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicDetailFooterView.h"
#import "TFComicDetailLeftViewController.h"
#import "TFComicDetailRightViewController.h"
@interface TFComicDetailFooterView () <SGPageTitleViewDelegate, SGPageContentCollectionViewDelegate>
{
TFComicDetailLeftViewController *leftVC;
TFComicDetailRightViewController *rightVC;
}
@property (nonatomic, strong) SGPageTitleView *pageTitleView;
@property (nonatomic, strong) SGPageContentCollectionView *pageContentCollectionView;
@end
@implementation TFComicDetailFooterView
- (void)viewDidLoad
{
[super viewDidLoad];
[self hiddenNavigationBar:YES];
[self createSubViews];
}
- (void)createSubViews
{
WS(weakSelf)
leftVC = [[TFComicDetailLeftViewController alloc] init];
leftVC.pushToComicDetailBlock = ^(NSInteger production_id) {
if (weakSelf.pushToComicDetailBlock) {
weakSelf.pushToComicDetailBlock(production_id);
}
};
rightVC = [[TFComicDetailRightViewController alloc] init];
NSArray *childArr = @[leftVC, rightVC];
NSArray *titleArr = @[TFLocalizedString(@"详情"), TFLocalizedString(@"目录")];
self.pageContentCollectionView = [[SGPageContentCollectionView alloc] initWithFrame:CGRectMake(0, 44.6, self.view.width, SCREEN_HEIGHT - PUB_NAVBAR_HEIGHT - PUB_TABBAR_OFFSET - 44 - 44.6 - kQuarterMargin) parentVC:self childVCs:childArr];
self.pageContentCollectionView.delegatePageContentCollectionView = self;
[self.view addSubview:self.pageContentCollectionView];
self.pageConfigure.bottomSeparatorColor = kGrayLineColor;
self.pageConfigure.titleFont = kMainFont;
self.pageTitleView = [SGPageTitleView pageTitleViewWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 44) delegate:self titleNames:titleArr configure:self.pageConfigure];
self.pageTitleView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.pageTitleView];
}
- (void)setDetailModel:(TFComicDetailModel *)detailModel
{
_detailModel = detailModel;
leftVC.detailModel = self.detailModel;
rightVC.comicModel = self.detailModel.productionModel;
}
- (void)setCanScroll:(BOOL)canScroll
{
leftVC.canScroll = canScroll;
rightVC.canScroll = canScroll;
}
- (void)setContentOffSetY:(CGFloat)contentOffSetY
{
rightVC.contentOffSetY = contentOffSetY;
}
- (void)pageTitleView:(SGPageTitleView *)pageTitleView selectedIndex:(NSInteger)selectedIndex {
[self.pageContentCollectionView setPageContentCollectionViewCurrentIndex:selectedIndex];
}
- (void)pageContentCollectionView:(SGPageContentCollectionView *)pageContentCollectionView progress:(CGFloat)progress originalIndex:(NSInteger)originalIndex targetIndex:(NSInteger)targetIndex {
[self.pageTitleView setPageTitleViewWithProgress:progress originalIndex:originalIndex targetIndex:targetIndex];
}
@end
@@ -0,0 +1,24 @@
//
// TFComicDetailHeaderView.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TFComicDetailModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface TFComicDetailHeaderView : UIView
@property (nonatomic ,strong) TFProductionModel *comicProductionModel;
@property (nonatomic ,assign) CGFloat headerViewAlpha;
- (void)reloadHeaderView;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,290 @@
//
// TFComicDetailHeaderView.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicDetailHeaderView.h"
#import "TFTagboardView.h"
#import "TFCollectionManager.h"
#import "UIView+AZGradient.h"
#import "UIImage+Blur.h"
@interface TFComicDetailHeaderView ()
{
UIView *backFrostedGlassView;
UIView *tagBottomView;
UIImageView *comicCoverImageView;
UILabel *comicTitleLabel;
UIButton *collectButton;
UILabel *hotLabel;
UILabel *authorLabel;
UILabel *collectNumLabel;
TFTagboardView *tagView;
UIVisualEffectView *effectView;
}
@property (nonatomic ,weak) UIImageView *backHoldImageView;
@end
@implementation TFComicDetailHeaderView
- (instancetype)init
{
if (self = [super init]) {
[self createSubViews];
}
return self;
}
- (void)createSubViews
{
UIImageView *backHoldImageView = [[UIImageView alloc] init];
self.backHoldImageView = backHoldImageView;
backHoldImageView.image = HoldImage;
backHoldImageView.contentMode = UIViewContentModeScaleAspectFill;
backHoldImageView.clipsToBounds = YES;
[self addSubview:backHoldImageView];
[backHoldImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(0);
make.top.mas_equalTo(0);
make.width.mas_equalTo(SCREEN_WIDTH);
make.height.mas_equalTo(Comic_Detail_HeaderView_Height);
}];
backFrostedGlassView = [[UIView alloc] init];
[self addSubview:backFrostedGlassView];
[backFrostedGlassView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(backHoldImageView);
}];
effectView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]];
effectView.alpha = 0;
[self addSubview:effectView];
[effectView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(backHoldImageView);
}];
tagBottomView = [[UIView alloc] init];
tagBottomView.backgroundColor = kWhiteColor;
tagBottomView.layer.cornerRadius = 20;
[self addSubview:tagBottomView];
[tagBottomView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(0);
make.bottom.mas_equalTo(self.mas_bottom).with.offset(kMargin);
make.width.mas_equalTo(self.mas_width);
make.height.mas_equalTo(80 + kMargin);
}];
comicCoverImageView = [[UIImageView alloc] initWithCornerRadiusAdvance:8 rectCornerType:UIRectCornerAllCorners];
comicCoverImageView.image = HoldImage;
comicCoverImageView.contentMode = UIViewContentModeScaleAspectFill;
[comicCoverImageView zy_attachBorderWidth:2 color:kWhiteColor];
[self addSubview:comicCoverImageView];
[comicCoverImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.mas_left).with.offset(kMargin);
make.bottom.mas_equalTo(self.mas_bottom).with.offset(- kQuarterMargin);
make.width.mas_equalTo((255) / 2);
make.height.mas_equalTo(kGeometricHeight((255) / 2, 3, 4));
}];
comicTitleLabel = [[UILabel alloc] init];
comicTitleLabel.textColor = kWhiteColor;
comicTitleLabel.textAlignment = NSTextAlignmentLeft;
comicTitleLabel.font = kBoldFont22;
[self addSubview:comicTitleLabel];
[comicTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(comicCoverImageView.mas_right).with.offset(kHalfMargin);
make.top.mas_equalTo(comicCoverImageView.mas_top);
make.right.mas_equalTo(self.mas_right).with.offset(- kHalfMargin);
make.height.mas_equalTo(30);
}];
collectButton = [UIButton buttonWithType:UIButtonTypeCustom];
collectButton.backgroundColor = kMainColor;
collectButton.layer.cornerRadius = 12;
collectButton.hidden = YES;
[collectButton setTitle:TFLocalizedString(@"+收藏") forState:UIControlStateNormal];
[collectButton setTitleColor:kWhiteColor forState:UIControlStateNormal];
[collectButton.titleLabel setFont:kFont12];
[collectButton addTarget:self action:@selector(collectionClick:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:collectButton];
[collectButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(self.mas_right).with.offset(- kMargin);
make.bottom.mas_equalTo(tagBottomView.mas_top).with.offset(- kHalfMargin);
make.height.mas_equalTo(24);
make.width.mas_equalTo(70.0);
}];
collectNumLabel = [[UILabel alloc] init];
collectNumLabel.backgroundColor = [UIColor clearColor];
collectNumLabel.textColor = kWhiteColor;
collectNumLabel.textAlignment = NSTextAlignmentLeft;
collectNumLabel.font = kMainFont;
[self addSubview:collectNumLabel];
[collectNumLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(comicCoverImageView.mas_right).with.offset(kHalfMargin);
make.bottom.mas_equalTo(collectButton.mas_bottom);
make.right.mas_equalTo(collectButton.mas_left).with.offset(-kQuarterMargin);
make.height.mas_equalTo(20);
}];
hotLabel = [[UILabel alloc] init];
hotLabel.backgroundColor = [UIColor clearColor];
hotLabel.textColor = kWhiteColor;
hotLabel.textAlignment = NSTextAlignmentLeft;
hotLabel.font = kMainFont;
[self addSubview:hotLabel];
[hotLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(comicCoverImageView.mas_right).with.offset(kHalfMargin);
make.bottom.mas_equalTo(collectNumLabel.mas_top).with.offset(- kQuarterMargin);
make.right.mas_equalTo(self.mas_right).with.offset(- kHalfMargin);
make.height.mas_equalTo(collectNumLabel.mas_height);
}];
authorLabel = [[UILabel alloc] init];
authorLabel.backgroundColor = [UIColor clearColor];
authorLabel.textColor = kWhiteColor;
authorLabel.textAlignment = NSTextAlignmentLeft;
authorLabel.font = kMainFont;
[self addSubview:authorLabel];
[authorLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(comicCoverImageView.mas_right).with.offset(kHalfMargin);
make.bottom.mas_equalTo(hotLabel.mas_top).with.offset(- kQuarterMargin);
make.right.mas_equalTo(self.mas_right).with.offset(- kHalfMargin);
make.height.mas_equalTo(collectNumLabel.mas_height);
}];
tagView = [[TFTagboardView alloc] init];
tagView.textAlignment = TFTagboardTextAlignmentLeft;
tagView.borderStyle = TFTagboardBorderStyleFill;
tagView.layoutStyle = TFTagboardLayoutStyleScroll;
tagView.spacing = 15;
tagView.cornerRadius = 8.5;
[self addSubview:tagView];
[tagView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(comicCoverImageView.mas_right).with.offset(kHalfMargin);
make.top.mas_equalTo(tagBottomView.mas_top).with.offset(kHalfMargin);
make.right.mas_equalTo(self.mas_right).with.offset(- kMargin);
make.height.mas_equalTo(20);
}];
}
- (void)setComicProductionModel:(TFProductionModel *)comicProductionModel
{
if (_comicProductionModel != comicProductionModel) {
_comicProductionModel = comicProductionModel;
collectButton.hidden = NO;
WS(weakSelf)
[[YYWebImageManager sharedManager] requestImageWithURL:[NSURL URLWithString:comicProductionModel.horizontal_cover.length > 0 ?comicProductionModel.horizontal_cover:comicProductionModel.vertical_cover] options:YYWebImageOptionSetImageWithFadeAnimation progress:nil transform:nil completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
SS(strongSelf)
weakSelf.backHoldImageView.image = [image imgWithLightAlpha:0.4 radius:3 colorSaturationFactor:1.8];
strongSelf->backFrostedGlassView.backgroundColor = kColorRGBA(0, 0, 0, 0.4);
});
}];
[comicCoverImageView setImageWithURL:[NSURL URLWithString:comicProductionModel.vertical_cover] placeholder:HoldImage options:YYWebImageOptionSetImageWithFadeAnimation completion:nil];
comicTitleLabel.attributedText = [self formatAttributedText:comicProductionModel.name];
hotLabel.attributedText = [self formatAttributedText:comicProductionModel.hot_num];
collectNumLabel.attributedText = [self formatAttributedText:comicProductionModel.total_favors];
authorLabel.attributedText = [self formatAttributedText:comicProductionModel.author];
tagView.tagboardArray = comicProductionModel.tag;
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeComic] isCollectedWithProductionModel:comicProductionModel]) {
collectButton.tag = 1;
collectButton.backgroundColor = [kMainColor colorWithAlphaComponent:0.75];
[collectButton setTitle:TFLocalizedString(@"已收藏") forState:UIControlStateNormal];
} else {
collectButton.tag = 0;
collectButton.backgroundColor = kMainColor;
[collectButton setTitle:TFLocalizedString(@"+收藏") forState:UIControlStateNormal];
}
}
}
- (NSAttributedString *)formatAttributedText:(NSString *)normalText
{
// NSShadow *shadow = [[NSShadow alloc] init];
// shadow.shadowBlurRadius = 6.0;
// shadow.shadowOffset = CGSizeMake(0, 0);
// shadow.shadowColor = [UIColor blackColor];
NSMutableAttributedString *authorAttString = [[NSMutableAttributedString alloc] initWithString:normalText?:@""];
// [authorAttString addAttribute:NSShadowAttributeName value:shadow range:NSMakeRange(0, authorAttString.length)];
return authorAttString;
}
- (void)setHeaderViewAlpha:(CGFloat)headerViewAlpha
{
_headerViewAlpha = headerViewAlpha;
[tagBottomView mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(80 * headerViewAlpha);
}];
comicCoverImageView.alpha = headerViewAlpha;
comicTitleLabel.alpha = headerViewAlpha;
collectButton.alpha = headerViewAlpha;
hotLabel.alpha = headerViewAlpha;
collectNumLabel.alpha = headerViewAlpha;
authorLabel.alpha = headerViewAlpha;
tagView.alpha = headerViewAlpha;
backFrostedGlassView.alpha = headerViewAlpha;
effectView.alpha = 1 - headerViewAlpha;
}
- (void)reloadHeaderView
{
if (![[TFCollectionManager shareManagerWithProductionType:TFProductionTypeComic] isCollectedWithProductionModel:self.comicProductionModel]) {
collectButton.backgroundColor = kMainColor;
[collectButton setTitle:TFLocalizedString(@"+收藏") forState:UIControlStateNormal];
} else {
collectButton.backgroundColor = [kMainColor colorWithAlphaComponent:0.75];
[collectButton setTitle:TFLocalizedString(@"已收藏") forState:UIControlStateNormal];
}
}
- (void)collectionClick:(UIButton *)sender
{
if (![[TFCollectionManager shareManagerWithProductionType:TFProductionTypeComic] isCollectedWithProductionModel:self.comicProductionModel]) {
[TFUtilsHelper synchronizationRackProductionWithProduction_id:self.comicProductionModel.production_id productionType:TFProductionTypeComic complete:nil];
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeComic] addCollectionWithProductionModel:self.comicProductionModel]) {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusSuccess promptTitle:TFLocalizedString(@"已加入书架")];
}
[self reloadHeaderView];
}
}
@end
@@ -0,0 +1,20 @@
//
// TFComicDetailIntroductionCell.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TFComicDetailModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface TFComicDetailIntroductionCell : TFBasicTableViewCell
@property (nonatomic ,strong) TFProductionModel *comicModel;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,95 @@
//
// TFComicDetailIntroductionCell.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicDetailIntroductionCell.h"
@interface TFComicDetailIntroductionCell ()
{
UILabel *introductionLabel;
UILabel *introductionContent;
}
@end
@implementation TFComicDetailIntroductionCell
- (void)createSubviews
{
[super createSubviews];
introductionLabel = [[UILabel alloc] init];
introductionLabel.text = TFLocalizedString(@"作品简介");
introductionLabel.textColor = kGrayTextDeepColor;
introductionLabel.textAlignment = NSTextAlignmentLeft;
introductionLabel.font = kMainFont;
[self.contentView addSubview:introductionLabel];
[introductionLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.contentView.mas_left).with.offset(kMargin);
make.top.mas_equalTo(self.contentView.mas_top).with.offset(kMargin);
make.right.mas_equalTo(self.contentView.mas_right).with.offset(- kMargin);
make.height.mas_equalTo(0.0);
}];
introductionContent = [[UILabel alloc] init];
introductionContent.textColor = kGrayTextColor;
introductionContent.textAlignment = NSTextAlignmentLeft;
introductionContent.font = kFont12;
introductionContent.numberOfLines = 0;
[self.contentView addSubview:introductionContent];
[introductionContent mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(introductionLabel.mas_left);
make.top.mas_equalTo(self.contentView.mas_top).offset(kHalfMargin);
make.right.mas_equalTo(introductionLabel.mas_right);
}];
UIView *splitLine = [[UIView alloc] init];
splitLine.backgroundColor = [UIColor clearColor];
[self.contentView addSubview:splitLine];
[splitLine mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(0.1);
make.right.bottom.left.equalTo(self.contentView);
make.top.equalTo(introductionContent.mas_bottom).offset(kHalfMargin).priorityLow();
}];
}
- (void)setComicModel:(TFProductionModel *)comicModel
{
if (_comicModel != comicModel) {
_comicModel = comicModel;
if (comicModel.production_descirption.length > 0) {
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:comicModel.production_descirption?:@""];
attributedString.lineSpacing = 6;
attributedString.font = kFont12;
attributedString.color = kGrayTextColor;
YYTextLayout *layout = [YYTextLayout layoutWithContainerSize:CGSizeMake(SCREEN_WIDTH - 2 * kMargin, MAXFLOAT) text:attributedString];
if (layout.rowCount < 5) {
introductionContent.attributedText = attributedString;
} else {
// 截取前5行的内容
YYTextLine *lastLine = layout.lines[4];
NSMutableAttributedString *t_atr = [[attributedString attributedSubstringFromRange:NSMakeRange(0, lastLine.range.location + lastLine.range.length)] mutableCopy];
// 截取第5行一半的内容
CGFloat maxWidth = (SCREEN_WIDTH - 2 * kMargin) / 2.0;
if (lastLine.lineWidth > maxWidth) {
// 获取多出来的距离
CGFloat spacing = lastLine.lineWidth - maxWidth;
// 获取多余的文字个数(多余的间距 / 单个字的宽度)
NSInteger number = spacing / (lastLine.lineWidth / lastLine.range.length);
t_atr = [[t_atr attributedSubstringFromRange:NSMakeRange(0, t_atr.length - number - 1)] mutableCopy];
[t_atr appendString:@" ..."];
}
introductionContent.attributedText = t_atr;
}
}
}
}
@end
@@ -0,0 +1,20 @@
//
// TFComicDetailRightViewCell.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TFReadRecordManager.h"
NS_ASSUME_NONNULL_BEGIN
@interface TFComicDetailRightViewCell : TFBasicTableViewCell
@property (nonatomic ,strong) TFProductionChapterModel *chapterModel;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,116 @@
//
// TFComicDetailRightViewCell.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicDetailRightViewCell.h"
#import "TFProductionCoverView.h"
@interface TFComicDetailRightViewCell ()
{
TFProductionCoverView *comicCoverImageView;
UILabel *comicTitleLabel;
UILabel *comicSubTitleLabel;
UIView *grayMask;
UIImageView *currentReadImageView;
}
@end
@implementation TFComicDetailRightViewCell
- (void)createSubviews
{
[super createSubviews];
self.selectionStyle = UITableViewCellSelectionStyleNone;
comicCoverImageView = [[TFProductionCoverView alloc] initWithProductionType:TFProductionTypeComic coverDirection:TFProductionCoverDirectionHorizontal];
[self.contentView addSubview:comicCoverImageView];
[comicCoverImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.contentView.mas_left).with.offset(kHalfMargin);
make.top.mas_equalTo(self.contentView.mas_top).with.offset(kHalfMargin * 0.8);
make.width.mas_equalTo(self.contentView.mas_width).multipliedBy(0.4).with.offset(- kMargin - kHalfMargin);
make.height.mas_equalTo(kGeometricHeight(((SCREEN_WIDTH * 0.4) - kMargin - kHalfMargin), 5, 3));
make.bottom.mas_equalTo(self.contentView.mas_bottom).with.offset(- kHalfMargin * 0.8).priorityLow();
}];
comicTitleLabel = [[UILabel alloc] init];
comicTitleLabel.textColor = kBlackColor;
comicTitleLabel.textAlignment = NSTextAlignmentLeft;
comicTitleLabel.font = kMainFont;
[self.contentView addSubview:comicTitleLabel];
[comicTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(comicCoverImageView.mas_right).with.offset(kHalfMargin);
make.top.mas_equalTo(comicCoverImageView.mas_top);
make.right.mas_equalTo(self.contentView.mas_right).with.offset(- kHalfMargin);
make.height.mas_equalTo(30);
}];
comicSubTitleLabel = [[UILabel alloc] init];
comicSubTitleLabel.textColor = kGrayTextColor;
comicSubTitleLabel.textAlignment = NSTextAlignmentLeft;
comicSubTitleLabel.font = kFont12;
[self.contentView addSubview:comicSubTitleLabel];
[comicSubTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(comicTitleLabel.mas_left);
make.bottom.mas_equalTo(comicCoverImageView.mas_bottom);
make.right.mas_equalTo(comicTitleLabel.mas_right);
make.height.mas_equalTo(20);
}];
grayMask = [[UIView alloc] init];
grayMask.backgroundColor = kWhiteColor;
grayMask.alpha = 0;
grayMask.userInteractionEnabled = YES;
[self.contentView addSubview:grayMask];
[grayMask mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.contentView);
}];
currentReadImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"comic_current_read"]];
currentReadImageView.hidden = YES;
[self.contentView addSubview:currentReadImageView];
[currentReadImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.contentView.mas_top).with.offset(kHalfMargin);
make.right.mas_equalTo(self.contentView.mas_right);
make.width.height.mas_equalTo(20);
}];
}
- (void)setChapterModel:(TFProductionChapterModel *)chapterModel
{
_chapterModel = chapterModel;
comicCoverImageView.coverImageUrl = chapterModel.cover;
comicCoverImageView.is_locked = chapterModel.is_preview;
comicTitleLabel.text = chapterModel.chapter_title?:@"";
comicSubTitleLabel.text = chapterModel.subtitle?:@"";
if ([[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] getReadingRecordChapter_idWithProduction_id:chapterModel.production_id] == chapterModel.chapter_id) {
self.contentView.backgroundColor = kGrayLineColor;
grayMask.alpha = 0.7;
currentReadImageView.hidden = NO;
} else if ([[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] chapterHasReadedWithProduction_id:chapterModel.production_id chapter_id:chapterModel.chapter_id]) {
self.contentView.backgroundColor = kGrayLineColor;
grayMask.alpha = 0.7;
currentReadImageView.hidden = YES;
} else {
self.contentView.backgroundColor = kWhiteColor;
grayMask.alpha = 0;
currentReadImageView.hidden = YES;
}
}
@end
@@ -0,0 +1,22 @@
//
// TFNovelDetailViewController.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TFBasicViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface TFNovelDetailViewController : TFBasicViewController
@property (nonatomic ,assign) NSInteger book_id; //书籍id
/// 是不是从阅读器进入
@property (nonatomic ,assign) BOOL isReader;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,905 @@
//
// 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
@@ -0,0 +1,23 @@
//
// TFNovelDetailModel.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class TFCommentsListModel, TFTagModel, TFProductionModel, TFProductionModel, TFBookStoreLabelModel;
@interface TFNovelDetailModel : NSObject
@property (nonatomic ,strong) NSArray <TFCommentsListModel *> *comment; // 作品评论列表
@property (nonatomic ,strong) NSArray <TFBookStoreLabelModel *> *label; // 推荐作品label
@property (nonatomic ,strong) TFProductionModel *bookModel; // 作品基本信息
@property (nonatomic ,strong) TFAdvertModel *advert; // 广告
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,29 @@
//
// TFNovelDetailModel.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFNovelDetailModel.h"
#import "TFBookStoreLabelModel.h"
@implementation TFNovelDetailModel
+ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass
{
return @{
@"label" : [TFBookStoreLabelModel class],
@"comment" : [TFCommentsListModel class],
@"advert" : [TFAdvertModel class]
};
}
+ (NSDictionary *)modelCustomPropertyMapper
{
return @{
@"bookModel" : @"book"
};
}
@end
@@ -0,0 +1,22 @@
//
// TFNovelDetailHeaderView.h
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef void(^CatalogueButtonClickBlock)(void);
@interface TFNovelDetailHeaderView : TFBasicTableViewCell
@property (nonatomic ,strong) TFProductionModel *bookModel;
@property (nonatomic ,copy) CatalogueButtonClickBlock catalogueButtonClickBlock;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,338 @@
//
// TFNovelDetailHeaderView.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/19.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFNovelDetailHeaderView.h"
#import "TFTagboardView.h"
#import "UIImage+Blur.h"
@interface TFNovelDetailHeaderView ()
{
TFProductionCoverView *bookImageView;
UILabel *bookNameLabel;
UILabel *authorLabel;
UILabel *introductionLabel;
UILabel *commontNumLabel;
UILabel *collecitonNumLabel;
UILabel *bookDescriptionLabel;
UILabel *timeLabel;
UIButton *catalogueButton;
UILabel *catalogueDetailLabel;
TFTagboardView *tagView;
}
@property (nonatomic, strong) UIImageView __block *headBackImageView;
@end
@implementation TFNovelDetailHeaderView
- (void)createSubviews
{
[super createSubviews];
// 背景图
_headBackImageView = [[UIImageView alloc] init];
_headBackImageView.backgroundColor = [UIColor whiteColor];
_headBackImageView.contentMode = UIViewContentModeScaleAspectFill;
_headBackImageView.clipsToBounds = YES;
_headBackImageView.image = HoldImage;
[self.contentView addSubview:_headBackImageView];
[_headBackImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.contentView.mas_left);
make.top.mas_equalTo(self.contentView.mas_top);
make.width.mas_equalTo(SCREEN_WIDTH);
make.height.mas_equalTo(SCREEN_WIDTH / 2 + PUB_NAVBAR_OFFSET + kMargin);
}];
// 书籍图片
bookImageView = [[TFProductionCoverView alloc] initWithProductionType:TFProductionTypeNovel coverDirection:TFProductionCoverDirectionVertical];
bookImageView.userInteractionEnabled = YES;
[self.contentView addSubview:bookImageView];
[bookImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.bottom.mas_equalTo(_headBackImageView.mas_bottom).with.offset(kMargin);
make.width.mas_equalTo(BOOK_WIDTH);
make.height.mas_equalTo(BOOK_HEIGHT);
}];
// 书名
bookNameLabel = [[UILabel alloc] init];
bookNameLabel.textAlignment = NSTextAlignmentLeft;
bookNameLabel.textColor = [UIColor whiteColor];
bookNameLabel.backgroundColor = [UIColor clearColor];
bookNameLabel.font = kBoldFont16;
[self.contentView addSubview:bookNameLabel];
[bookNameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(bookImageView.mas_right).with.offset(kMargin);
make.top.mas_equalTo(bookImageView.mas_top);
make.right.mas_equalTo(self.contentView.mas_right).with.offset(- kMargin);
make.height.mas_equalTo(kLabelHeight);
}];
// 作者
authorLabel = [[UILabel alloc] init];
authorLabel.backgroundColor = [UIColor clearColor];
authorLabel.textColor = [UIColor whiteColor];
authorLabel.textAlignment = NSTextAlignmentLeft;
authorLabel.font = kFont12;
[self.contentView addSubview:authorLabel];
[authorLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(bookNameLabel.mas_left);
make.top.mas_equalTo(bookNameLabel.mas_bottom).with.offset(5);
make.width.mas_equalTo(bookNameLabel.mas_width).multipliedBy(0.5);
make.height.mas_equalTo(17);
}];
// 书籍标签
introductionLabel = [[UILabel alloc] init];
introductionLabel.backgroundColor = [UIColor clearColor];
introductionLabel.textColor = [UIColor whiteColor];
introductionLabel.textAlignment = NSTextAlignmentLeft;
introductionLabel.font = kFont12;
[self.contentView addSubview:introductionLabel];
[introductionLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(bookNameLabel.mas_left);
make.top.mas_equalTo(authorLabel.mas_bottom).with.offset(5);
make.width.mas_equalTo(bookNameLabel.mas_width).multipliedBy(0.5);
make.height.mas_equalTo(authorLabel.mas_height);
}];
// 评价数
commontNumLabel = [[UILabel alloc] init];
commontNumLabel.backgroundColor = [UIColor clearColor];
commontNumLabel.textColor = [UIColor whiteColor];
commontNumLabel.textAlignment = NSTextAlignmentLeft;
commontNumLabel.font = kFont12;
[self.contentView addSubview:commontNumLabel];
[commontNumLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(bookNameLabel.mas_left);
make.top.mas_equalTo(introductionLabel.mas_bottom).with.offset(kQuarterMargin);
make.width.mas_equalTo(bookNameLabel.mas_width).multipliedBy(0.5);
make.height.mas_equalTo(authorLabel.mas_height);
}];
collecitonNumLabel = [[UILabel alloc] init];
collecitonNumLabel.backgroundColor = [UIColor clearColor];
collecitonNumLabel.textColor = [UIColor whiteColor];
collecitonNumLabel.textAlignment = NSTextAlignmentLeft;
collecitonNumLabel.font = kFont12;
[self.contentView addSubview:collecitonNumLabel];
[collecitonNumLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(bookNameLabel.mas_left);
make.top.mas_equalTo(commontNumLabel.mas_bottom).with.offset(kQuarterMargin);
make.width.mas_equalTo(bookNameLabel.mas_width).multipliedBy(0.5);
make.height.mas_equalTo(authorLabel.mas_height);
}];
// 简介
bookDescriptionLabel = [[UILabel alloc] init];
bookDescriptionLabel.backgroundColor = [UIColor whiteColor];
bookDescriptionLabel.textColor = kBlackColor;
bookDescriptionLabel.textAlignment = NSTextAlignmentLeft;
bookDescriptionLabel.font = kMainFont;
bookDescriptionLabel.numberOfLines = 0;
[self.contentView addSubview:bookDescriptionLabel];
[bookDescriptionLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.top.mas_equalTo(bookImageView.mas_bottom).with.offset(kHalfMargin);
make.width.mas_equalTo(self.mas_width).with.offset(- 2 * kMargin);
make.height.mas_equalTo(50);
}];
// 目录列
catalogueButton = [UIButton buttonWithType:UIButtonTypeCustom];
catalogueButton.backgroundColor = [UIColor clearColor];
catalogueButton.hidden = YES;
[catalogueButton addTarget:self action:@selector(catalogueClick) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:catalogueButton];
[catalogueButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(0);
make.top.mas_equalTo(bookDescriptionLabel.mas_bottom).with.offset(kHalfMargin);
make.width.mas_equalTo(self.contentView.mas_width);
make.height.mas_equalTo(kLabelHeight + kHalfMargin);
}];
UIImageView *catalogueIcon = [[UIImageView alloc] init];
catalogueIcon.image = [UIImage imageNamed:@"book_directory"];
catalogueIcon.userInteractionEnabled = YES;
[catalogueButton addSubview:catalogueIcon];
[catalogueIcon mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.centerY.mas_equalTo(catalogueButton.mas_centerY);
make.height.mas_equalTo(kMargin);
make.width.mas_equalTo(kMargin);
}];
UILabel *catalogueTitle = [[UILabel alloc] init];
catalogueTitle.text = TFLocalizedString(@"目录");
catalogueTitle.font = kMainFont;
catalogueTitle.textColor = kBlackColor;
catalogueTitle.textAlignment = NSTextAlignmentLeft;
[catalogueButton addSubview:catalogueTitle];
[catalogueTitle mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(catalogueIcon.mas_right).with.offset(5);
make.centerY.mas_equalTo(catalogueIcon.mas_centerY);
make.width.mas_equalTo(catalogueTitle.intrinsicContentSize.width);
make.height.mas_equalTo(catalogueIcon.mas_height);
}];
// 横线
for (int i = 0; i < 2; i ++) {
UIView *cellLine = [[UIView alloc] init];
cellLine.hidden = NO;
cellLine.backgroundColor = kGrayLineColor;
[catalogueButton addSubview:cellLine];
[cellLine mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
if (i == 0) {
make.top.mas_equalTo(kCellLineHeight);
} else {
make.bottom.mas_equalTo(catalogueButton.mas_bottom).with.offset(- kCellLineHeight);
}
make.width.mas_equalTo(self.mas_width).with.offset( - kMargin);
make.height.mas_equalTo(kCellLineHeight);
}];
}
UIImageView *connerImageView = [[UIImageView alloc] init];
connerImageView.image = [[UIImage imageNamed:@"public_more"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
connerImageView.userInteractionEnabled = YES;
connerImageView.tintColor = kGrayTextColor;
[catalogueButton addSubview:connerImageView];
[connerImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(catalogueButton.mas_right).with.offset(- kMargin);
make.centerY.mas_equalTo(catalogueButton.mas_centerY);
make.width.height.mas_equalTo(10);
}];
timeLabel = [[UILabel alloc] init];
timeLabel.textAlignment = NSTextAlignmentRight;
timeLabel.font = kFont10;
timeLabel.textColor = kGrayTextColor;
[catalogueButton addSubview:timeLabel];
[timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(connerImageView.mas_left).with.offset(- kQuarterMargin);
make.top.mas_equalTo(0);
make.width.mas_equalTo(CGFLOAT_MIN);
make.height.mas_equalTo(catalogueButton.mas_height);
}];
catalogueDetailLabel = [[UILabel alloc] init];
catalogueDetailLabel.backgroundColor = [UIColor clearColor];
catalogueDetailLabel.textAlignment = NSTextAlignmentLeft;
catalogueDetailLabel.font = kFont12;
catalogueDetailLabel.textColor = kGrayTextColor;
[catalogueButton addSubview:catalogueDetailLabel];
[catalogueDetailLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(catalogueTitle.mas_right).offset(kQuarterMargin);
make.top.mas_equalTo(0);
make.right.mas_equalTo(timeLabel.mas_left).with.offset(- kQuarterMargin);
make.height.mas_equalTo(catalogueButton.mas_height);
}];
// 标签
tagView = [[TFTagboardView alloc] init];
tagView.textAlignment = TFTagboardTextAlignmentLeft;
tagView.borderStyle = TFTagboardBorderStyleFill;
tagView.layoutStyle = TFTagboardLayoutStyleScroll;
[self.contentView addSubview:tagView];
[tagView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(kMargin);
make.top.mas_equalTo(catalogueButton.mas_bottom).with.offset(kHalfMargin);
make.width.mas_equalTo(self.contentView.mas_width).with.offset(- 2 * kMargin);
make.height.mas_equalTo(20);
make.bottom.mas_equalTo(self.contentView.mas_bottom).with.offset(- kHalfMargin).priorityLow();
}];
}
- (void)catalogueClick
{
if (self.catalogueButtonClickBlock) {
self.catalogueButtonClickBlock();
}
}
- (void)setBookModel:(TFProductionModel *)bookModel
{
if (bookModel && (_bookModel != bookModel)) {
_bookModel = bookModel;
WS(weakSelf)
[[YYWebImageManager sharedManager] requestImageWithURL:[NSURL URLWithString:bookModel.cover?:@""] options:YYWebImageOptionSetImageWithFadeAnimation progress:nil transform:nil completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.headBackImageView.image = [image imgWithLightAlpha:0.4 radius:3 colorSaturationFactor:1.8];
});
}];
bookImageView.coverImageUrl = bookModel.cover;
bookNameLabel.text = [TFUtilsHelper formatStringWithObject:bookModel.name?:@""];
authorLabel.text = [TFUtilsHelper formatStringWithObject:bookModel.author?:@""];
[introductionLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(bookNameLabel.mas_left);
make.top.mas_equalTo(authorLabel.mas_bottom).with.offset(5);
make.width.mas_equalTo(bookNameLabel.mas_width);
make.height.mas_equalTo(authorLabel.mas_height);
}];
commontNumLabel.text = [TFUtilsHelper formatStringWithObject:bookModel.hot_num?:@""];
collecitonNumLabel.text = [TFUtilsHelper formatStringWithObject:bookModel.total_favors?:@""];
// 截取简介
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:bookModel.production_descirption?:@""];
attributedString.lineSpacing = 5;
attributedString.font = kFont(13);
attributedString.color = kBlackColor;
NSAttributedString *separatedString = [TFViewHelper getSubContentWithOriginalContent:attributedString labelWidth:(SCREEN_WIDTH - 2 * (kMargin + kHalfMargin)) labelMaxLine:4];
bookDescriptionLabel.attributedText = separatedString;
if (separatedString.length == 0) {
[bookDescriptionLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(0.0);
}];
} else {
[bookDescriptionLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo([TFViewHelper boundsWithFont:kFont(13) attributedText:separatedString needWidth:(SCREEN_WIDTH - 2 * (kMargin + kHalfMargin)) lineSpacing:6] + kHalfMargin);
}];
}
tagView.tagboardArray = bookModel.tag;
timeLabel.text = bookModel.last_chapter_time?:@"";
[timeLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo([TFViewHelper getDynamicWidthWithLabel:timeLabel]);
}];
catalogueDetailLabel.text = bookModel.last_chapter?:@"";
catalogueButton.hidden = NO;
}
}
@end