小说绘上架版本

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