You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

809 lines
34 KiB

//
// TFComicBrowseViewController.m
// TFReader
//
// Created by 谢腾飞 on 2020/12/15.
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
//
#import "TFComicBrowseViewController.h"
#import "TFCommentsViewController.h"
#import "TFComicCatalogueViewController.h"
#import "TFComicDownloadViewController.h"
#import "TFComicBrowseViewCell.h"
#import "TFComicBrowseBottomCell.h"
#import "TFPublicAdvertisementViewCell.h"
#import "TFComicBrowseMenuView.h"
#import "WXYZ_ChapterBottomPayBar.h"
#import "TFAdvertisementManager.h"
#import "WXYZ_ComicDownloadManager.h"
#import "TFReadRecordManager.h"
#import "TFNightModeView.h"
#import "TFComicBarrageModel.h"
#import "OCBarrage.h"
#import "TFCollectionManager.h"
#define MinScale 1.0f
#define MaxScale 2.0f
@interface TFComicBrowseViewController ()<UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate>
{
BOOL isEnableTurnPage;
BOOL isEnableBarrage;
}
@property (nonatomic ,strong) UIScrollView *mainBottomScrollView;
@property (nonatomic ,strong) TFProductionChapterModel *comicChapterModel;
@property (nonatomic ,strong) TFAdvertModel *adModel;
@property (nonatomic ,strong) UIView *welcomePageView;
@property (nonatomic ,strong) WXYZ_ChapterBottomPayBar *payBar;
@property (nonatomic ,strong) OCBarrageManager *barrageManager;
@property (nonatomic ,strong) NSMutableArray<TFComicBarrageList *> *barrageList;
/// 弹幕所有的数据
@property (nonatomic ,copy) NSArray<TFComicBarrageList *> *totalBarrageArray;
/// YES:弹幕数据已完
@property (nonatomic ,assign) BOOL barrageComplete;
@property (nonatomic ,assign) BOOL needRefresh;
/// 上次请求的章节ID
@property (nonatomic ,assign) NSInteger oldChapterID;
@end
@implementation TFComicBrowseViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self initialize];
[self createSubviews];
[self netRequest];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self setStatusBarDefaultStyle];
if (self.comicProductionModel.is_recommend) {
self.comicProductionModel.is_recommend = NO;
[[TFCollectionManager shareManagerWithProductionType:TFProductionTypeComic] modificationCollectionWithProductionModel:self.comicProductionModel];
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[UIApplication sharedApplication].statusBarHidden = NO;
if (self.mainTableViewGroup.contentOffset.y > 0) {
[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] setComicReadingRecord:self.comicChapterModel.production_id chapter_id:self.chapter_id offsetY:self.mainTableViewGroup.contentOffset.y];
}
}
- (void)initialize
{
self.oldChapterID = -1;
self.needRefresh = YES;
self.barrageList = [NSMutableArray array];
self.totalBarrageArray = [NSArray array];
[self setNavigationBarTitle:[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] getReadingRecordChapterTitleWithProduction_id : self.comicProductionModel.production_id] ? : @""];
if ([[[NSUserDefaults standardUserDefaults] objectForKey:Enable_Click_Page] isEqualToString:@"0"]) {
isEnableTurnPage = NO;
} else {
isEnableTurnPage = YES;
}
NSString *enableBarrage = [[NSUserDefaults standardUserDefaults] objectForKey:Enable_Barrage];
if ([enableBarrage isEqualToString:@"0"] || !enableBarrage) {
isEnableBarrage = NO;
} else {
isEnableBarrage = YES;
}
[[TFCollectionManager shareManagerWithProductionType:TFProductionTypeComic] moveCollectionToTopWithProductionModel:self.comicProductionModel];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeChapter:) name:Notification_Switch_Chapter object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(popViewController) name:Notification_Pop_Comic_Reader object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushToComments) name:Notification_Push_To_Comments object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushToDirectory) name:Notification_Push_To_Directory object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enableTapClick:) name:Enable_Click_Page object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(barrageSwitchClick:) name:Notification_Switch_Barrage object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tableViewScorllToTop) name:Notification_Reader_Scroll_To_Top object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushToDownloadView) name:Notification_Push_To_Comic_Download object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeBarrage:) name:Notification_Change_Barrage object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nightModeChange:) name:Enable_Click_Night object:nil];
}
- (void)createSubviews
{
self.mainBottomScrollView = [[UIScrollView alloc] init];
self.mainBottomScrollView.minimumZoomScale = MinScale;
self.mainBottomScrollView.maximumZoomScale = MaxScale;
self.mainBottomScrollView.bounces = NO;
self.mainBottomScrollView.delegate = self;
self.mainBottomScrollView.showsVerticalScrollIndicator = NO;
self.mainBottomScrollView.showsHorizontalScrollIndicator = NO;
[self.view addSubview:self.mainBottomScrollView];
[self.mainBottomScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(0);
make.top.mas_equalTo(0);
make.width.mas_equalTo(SCREEN_WIDTH);
make.height.mas_equalTo(SCREEN_HEIGHT);
}];
if (@available(iOS 11.0, *)) {
self.mainBottomScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
self.mainTableViewGroup.delegate = self;
self.mainTableViewGroup.dataSource = self;
[self.mainBottomScrollView addSubview:self.mainTableViewGroup];
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_HEIGHT, PUB_NAVBAR_HEIGHT)];
headerView.backgroundColor = kWhiteColor;
[self.mainTableViewGroup setTableHeaderView:headerView];
[self.mainTableViewGroup mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(0);
make.top.mas_equalTo(0);
make.width.mas_equalTo(self.mainBottomScrollView.mas_width);
make.height.mas_equalTo(self.mainBottomScrollView.mas_height);
}];
WS(weakSelf)
CGFloat y = (SCREEN_HEIGHT - 290) / 2.0 - 50;
[self setEmptyOnView:self.mainTableViewGroup imageName:@"" title:TFLocalizedString(@"内容获取失败") detailTitle:nil buttonTitle:TFLocalizedString(@"重试") centerY:y tapBlock:^{
[weakSelf netRequest];
}];
// [self.mainTableViewGroup addToastFooterRefreshWithRefreshingBlock:^{
// [[NSNotificationCenter defaultCenter] postNotificationName:Notification_Switch_Chapter object:[TFUtilsHelper formatStringWithInteger:weakSelf.comicChapterModel.next_chapter]];
// }];
self.mainTableViewGroup.mj_footer = [MJRefreshFooter footerWithRefreshingBlock:^{
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Switch_Chapter object:[TFUtilsHelper formatStringWithInteger:weakSelf.comicChapterModel.next_chapter]];
}];
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
singleTapRecognizer.numberOfTouchesRequired = 1;
[self.mainTableViewGroup addGestureRecognizer:singleTapRecognizer];
UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
doubleTapRecognizer.numberOfTapsRequired = 2;
[self.mainTableViewGroup addGestureRecognizer:doubleTapRecognizer];
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
[self.view addSubview:self.welcomePageView];
[self.view addSubview:[TFComicBrowseMenuView sharedManager]];
if ([[[NSUserDefaults standardUserDefaults] objectForKey:Enable_Click_Night] isEqualToString:@"1"]) {
[self.view addSubview:[TFNightModeView sharedManager]];
}
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.mainTableViewGroup;
}
- (void)tableViewScorllToTop
{
[self.mainTableViewGroup scrollToTop];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (self.comicChapterModel.is_preview) {
[[TFComicBrowseMenuView sharedManager] showMenuView];
[self.barrageManager pause];
return;
}
if (scrollView == self.mainTableViewGroup) {
if (scrollView.contentOffset.y <= PUB_NAVBAR_HEIGHT) {
[[TFComicBrowseMenuView sharedManager] showMenuView];
[self.barrageManager pause];
} else if (scrollView.contentOffset.y > scrollView.contentSize.height - SCREEN_HEIGHT - PUB_NAVBAR_HEIGHT) {
[[TFComicBrowseMenuView sharedManager] showMenuView];
[self.barrageManager pause];
} else {
[[TFComicBrowseMenuView sharedManager] hiddenMenuView];
if (isEnableBarrage) {
[self.barrageManager resume];
}
}
}
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
if (self.comicChapterModel.image_list.count > 0) {
if ([TFAdvertisementManager whetherToLoadAdsWithAdvertisementType:TFAdvertisementTypeComic advertisementPosition:TFAdvertisementPositionEnd]) {
return 3;
}
return 2;
}
return 0;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == 0) {
return self.comicChapterModel.image_list.count;
}
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (self.comicChapterModel.image_list.count > 0) {
if (indexPath.section == 0) {
TFComicBrowseViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TFComicBrowseViewCell"];
if (!cell) {
cell = [[TFComicBrowseViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TFComicBrowseViewCell"];
}
cell.comic_id = self.comicChapterModel.production_id;
cell.chapter_id = self.comicChapterModel.chapter_id;
cell.chapter_update_time = [self.comicChapterModel.update_time integerValue];
cell.imageModel = [self.comicChapterModel.image_list objectOrNilAtIndex:indexPath.row];
return cell;
}
if ([TFAdvertisementManager whetherToLoadAdsWithAdvertisementType:TFAdvertisementTypeComic advertisementPosition:TFAdvertisementPositionEnd]) {
if (indexPath.section == 1) {
static NSString *cellName = @"TFPublicAdvertisementViewCell";
TFPublicAdvertisementViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
if (!cell) {
cell = [[TFPublicAdvertisementViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellName];
}
[cell setAdModel:self.adModel refresh:self.needRefresh];
cell.mainTableView = tableView;
return cell;
}
}
TFComicBrowseBottomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TFComicBrowseBottomCell"];
if (!cell) {
cell = [[TFComicBrowseBottomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TFComicBrowseBottomCell"];
}
cell.comicChapterModel = self.comicChapterModel;
return cell;
}
return [[UITableViewCell alloc] init];
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if ([TFAdvertisementManager whetherToLoadAdsWithAdvertisementType:TFAdvertisementTypeComic advertisementPosition:TFAdvertisementPositionEnd] && section == 1) {
return kHalfMargin;
}
return CGFLOAT_MIN;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, CGFLOAT_MIN)];
view.backgroundColor = [UIColor clearColor];
return view;
}
- (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, CGFLOAT_MIN)];
view.backgroundColor = [UIColor clearColor];
return view;
}
#pragma mark - 点击事件
- (void)singleTap:(UITapGestureRecognizer *)tapGes
{
CGPoint touchPoint = [tapGes locationInView:self.view];
CGFloat contentOffSetY = self.mainTableViewGroup.contentOffset.y;
CGFloat contentSizeH = self.mainTableViewGroup.contentSize.height;
CGFloat scrollOffSet = SCREEN_HEIGHT * self.mainBottomScrollView.zoomScale * 3 / 4;
if ([TFComicBrowseMenuView sharedManager].isShowing) {
if (touchPoint.y < PUB_NAVBAR_HEIGHT || touchPoint.y > SCREEN_HEIGHT - 80) {
return;
}
}
if (touchPoint.y <= SCREEN_HEIGHT / 3 && isEnableTurnPage) { // 向上滚动
[self.mainTableViewGroup setContentOffset:CGPointMake(0, (contentOffSetY - SCREEN_HEIGHT / 4 * 3) <= 0?0:(contentOffSetY - SCREEN_HEIGHT / 4 * 3 + SCREEN_HEIGHT * (self.mainBottomScrollView.zoomScale - MinScale))) animated:YES];
} else if (touchPoint.y >= SCREEN_HEIGHT / 3 * 2 && isEnableTurnPage) { // 向下滚动
if (contentOffSetY + SCREEN_HEIGHT + scrollOffSet >= contentSizeH) {
contentOffSetY = contentSizeH - SCREEN_HEIGHT + (SCREEN_HEIGHT / 4) * (self.mainBottomScrollView.zoomScale - MinScale);
} else {
contentOffSetY = contentOffSetY + scrollOffSet;
}
[self.mainTableViewGroup setContentOffset:CGPointMake(0, contentOffSetY) animated:YES];
} else { // 菜单栏
if (contentOffSetY > PUB_NAVBAR_HEIGHT && !(contentOffSetY > contentSizeH - SCREEN_HEIGHT - PUB_NAVBAR_HEIGHT)) {
[[TFComicBrowseMenuView sharedManager] autoShowOrHiddenMenuView];
if ([TFComicBrowseMenuView sharedManager].isShowing) {
[self.barrageManager pause];
} else {
if (isEnableBarrage) {
[self.barrageManager resume];
}
}
}
}
}
- (void)doubleTap:(UITapGestureRecognizer *)tapGes
{
if (self.comicChapterModel.image_list.count == 0) return;
CGFloat currScale = self.mainBottomScrollView.zoomScale;
CGFloat goalScale;
if ([TFComicBrowseMenuView sharedManager].isShowing) {
if ([tapGes locationInView:self.view].y < PUB_NAVBAR_HEIGHT || [tapGes locationInView:self.view].y > SCREEN_HEIGHT - 80) {
return;
}
}
if (currScale == MinScale) {
goalScale = MaxScale;
} else {
goalScale = MinScale;
}
if (currScale == goalScale) {
return;
}
CGPoint touchPoint = [tapGes locationInView:[self viewForZoomingInScrollView:self.mainBottomScrollView]];
CGFloat xsize = self.mainBottomScrollView.frame.size.width / goalScale;
CGFloat ysize = self.mainBottomScrollView.frame.size.height / goalScale;
CGFloat x = touchPoint.x - xsize / 2;
CGFloat y = touchPoint.y - ysize / 2;
[self.mainBottomScrollView zoomToRect:CGRectMake(x, y, xsize, ysize) animated:YES];
}
- (void)enableTapClick:(NSNotification *)noti
{
if ([noti.object isEqualToString:@"1"]) {
isEnableTurnPage = YES;
}
if ([noti.object isEqualToString:@"0"]) {
isEnableTurnPage = NO;
}
}
- (void)barrageSwitchClick:(NSNotification *)noti
{
if ([noti.object isEqualToString:@"1"]) {
isEnableBarrage = YES;
// [self.barrageManager resume];
[self addNormalBarrage];
self.barrageManager.renderView.hidden = NO;
}
if ([noti.object isEqualToString:@"0"]) {
isEnableBarrage = NO;
// [self.barrageManager pause];
self.barrageManager.renderView.hidden = YES;
}
}
- (void)nightModeChange:(NSNotification *)noti
{
if ([noti.object isEqualToString:@"1"]) {
[self.view addSubview:[TFNightModeView sharedManager]];
} else {
[[TFNightModeView sharedManager] removeFromSuperview];
}
}
- (void)pushToComments
{
TFCommentsViewController *vc = [[TFCommentsViewController alloc] init];
vc.production_id = self.comicProductionModel.production_id;
vc.chapter_id = self.chapter_id;
vc.productionType = TFProductionTypeComic;
vc.commentsSuccessBlock = ^(TFCommentsListModel *commentModel) {
TFProductionChapterModel *chapterModel = [TFComicBrowseMenuView sharedManager].comicChapterModel;
chapterModel.total_comment = commentModel.comment_num;
[TFComicBrowseMenuView sharedManager].comicChapterModel = chapterModel;
};
TFNavigationController *nav = [[TFNavigationController alloc] initWithRootViewController:vc];
[self.navigationController presentViewController:nav animated:YES completion:nil];
}
- (void)pushToDirectory
{
TFComicCatalogueViewController *vc = [[TFComicCatalogueViewController alloc] init];
vc.comic_id = self.comicProductionModel.production_id;
[self.navigationController pushViewController:vc animated:YES];
}
- (void)pushToDownloadView
{
TFComicDownloadViewController *vc = [[TFComicDownloadViewController alloc] init];
vc.comicModel = self.comicProductionModel;
[self.navigationController pushViewController:vc animated:YES];
}
- (void)changeChapter:(NSNotification *)noti
{
self.chapter_id = [noti.object integerValue];
[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] addReadingRecordWithProduction_id:self.comicChapterModel.production_id chapter_id:self.chapter_id chapterTitle:self.comicChapterModel.chapter_title];
[self.mainTableViewGroup setContentOffset:CGPointZero];
[self netRequest];
}
- (void)reloadDataSource
{
[self hiddenNavigationBar:YES];
[self hiddenNavigationBarLeftButton];
self.mainBottomScrollView.userInteractionEnabled = YES;
[[TFComicBrowseMenuView sharedManager] showMenuView];
self.needRefresh = YES;
[self.mainTableViewGroup reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
self.needRefresh = NO;
});
NSDictionary<NSString *, NSString *> *dict = [[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] getComicReadingRecord:self.comicChapterModel.production_id];
if ([dict objectForKey:[NSString stringWithFormat:@"%zd", self.chapter_id]]) {
CGFloat offsetY = [[dict objectForKey:[NSString stringWithFormat:@"%zd", self.chapter_id]] floatValue];
if (offsetY > self.mainTableViewGroup.contentSize.height) {
offsetY = self.mainTableViewGroup.contentSize.height;
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.mainTableViewGroup setContentOffset:CGPointMake(0, offsetY)];
});
}
if (!self.comicChapterModel) {
[[NSNotificationCenter defaultCenter] postNotificationName:Enable_Click_Page object:@"0"];
}
[self.mainTableViewGroup xtfei_endLoading];
if (self.welcomePageView.alpha > 0) {
[UIView animateWithDuration:kAnimatedDuration animations:^{
self.welcomePageView.alpha = 0;
} completion:^(BOOL finished) {
[self.welcomePageView removeAllSubviews];
[self.welcomePageView removeFromSuperview];
}];
}
}
- (UIView *)welcomePageView
{
if (!_welcomePageView) {
_welcomePageView = [[UIView alloc] init];
_welcomePageView.backgroundColor = kWhiteColor;
_welcomePageView.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
_welcomePageView.userInteractionEnabled = NO;
NSMutableArray *imagesArray = [NSMutableArray array];
for (int i = 1; i < 27; i++) {
[imagesArray addObject:[YYImage imageNamed:[NSString stringWithFormat:@"comic_loading%d.png", i]]];
}
YYAnimatedImageView *imageView = [[YYAnimatedImageView alloc] init];
imageView.animationDuration = 2;
imageView.animationImages = imagesArray;
imageView.animationRepeatCount = 999;
[_welcomePageView addSubview:imageView];
[imageView startAnimating];
[imageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(_welcomePageView.mas_centerX).with.offset(- kMargin);
make.centerY.mas_equalTo(_welcomePageView.mas_centerY);
make.width.height.mas_equalTo(_welcomePageView.mas_width).with.multipliedBy(0.5);
}];
UIView *progress = [[UIView alloc] init];
progress.backgroundColor = kGrayViewColor;
progress.layer.cornerRadius = 1.5;
[_welcomePageView addSubview:progress];
[progress mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(_welcomePageView.mas_centerX);
make.top.mas_equalTo(imageView.mas_bottom);
make.width.mas_equalTo(imageView.mas_width);
make.height.mas_equalTo(3);
}];
UIBezierPath *bezPath = [UIBezierPath bezierPath];
[bezPath moveToPoint:CGPointMake(0, 1)];
[bezPath addLineToPoint:CGPointMake(SCREEN_WIDTH / 2, 1)];
CAShapeLayer *layer = [CAShapeLayer layer];
layer.lineWidth = 3;
layer.path = bezPath.CGPath;
layer.strokeColor = kMainColor.CGColor;
layer.fillColor = kGrayViewColor.CGColor;
layer.lineCap = @"round";
[progress.layer addSublayer:layer];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
animation.duration = 30;
animation.fromValue = @0;
animation.toValue = @1;
animation.repeatCount = 999;
[layer addAnimation:animation forKey:nil];
}
return _welcomePageView;
}
- (void)netRequest
{
if ([TFNetworkManager networkingStatus] == NO) {
[self.emptyView setTitle:TFLocalizedString(@"当前为离线状态,只可查看缓存内容哦")];
// 获取本地缓存信息
self.comicChapterModel = [[WXYZ_ComicDownloadManager sharedManager] getDownloadChapterModelWithProduction_id:self.comicProductionModel.production_id chapter_id:[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] getReadingRecordChapter_idWithProduction_id:self.comicProductionModel.production_id]];
// 不存在就只展示缓存内容
if (!self.comicChapterModel) {
TFProductionModel *productionModel = [[WXYZ_DownloadHelper sharedManager] getDownloadProductionModelWithProduction_id:self.comicProductionModel.production_id productionType:TFProductionTypeComic];
// 没有阅读记录
if (self.chapter_id == 0) {
self.comicChapterModel = [productionModel.chapter_list firstObject];
self.chapter_id = self.comicChapterModel.chapter_id;
} else {
for (TFProductionChapterModel *chapterModel in productionModel.chapter_list) {
if (self.chapter_id == chapterModel.chapter_id) {
self.comicChapterModel = chapterModel;
}
}
}
}
// 设置记录信息
[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] addReadingRecordWithProduction_id:self.comicChapterModel.production_id chapter_id:self.chapter_id chapterTitle:self.comicChapterModel.chapter_title];
[[TFComicBrowseMenuView sharedManager] stopLoadingData];
[TFComicBrowseMenuView sharedManager].comicChapterModel = self.comicChapterModel;
[TFComicBrowseMenuView sharedManager].productionModel = self.comicProductionModel;
if (self.comicChapterModel.next_chapter > 0) {
[self.mainTableViewGroup showRefreshFooter];
} else {
[self.mainTableViewGroup hideRefreshFooter];
}
[self reloadDataSource];
[self.mainTableViewGroup endRefreshing];
[self.mainTableViewGroup xtfei_endLoading];
return;
}
WS(weakSelf)
[self.emptyView setTitle:TFLocalizedString(@"内容获取失败")];
[self.emptyView setBtnTitle:TFLocalizedString(@"重试")];
[[TFComicBrowseMenuView sharedManager] startLoadingData];
self.mainBottomScrollView.userInteractionEnabled = NO;
if (self.chapter_id == self.oldChapterID) return;
[TFNetworkTools POST:Comic_Chapter parameters:@{@"comic_id":[TFUtilsHelper formatStringWithInteger:self.comicProductionModel.production_id], @"chapter_id":[TFUtilsHelper formatStringWithInteger:self.chapter_id]} model:TFProductionChapterModel.class success:^(BOOL isSuccess, TFProductionChapterModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) {
[[TFComicBrowseMenuView sharedManager] stopLoadingData];
weakSelf.oldChapterID = -1;
if (isSuccess) {
weakSelf.comicChapterModel = t_model;
weakSelf.chapter_id = t_model.chapter_id;
[weakSelf requestBarrage];
[[TFReadRecordManager shareManagerWithProductionType:TFProductionTypeComic] addReadingRecordWithProduction_id:t_model.production_id chapter_id:t_model.chapter_id chapterTitle:t_model.chapter_title];
[TFComicBrowseMenuView sharedManager].comicChapterModel = t_model;
[TFComicBrowseMenuView sharedManager].productionModel = weakSelf.comicProductionModel;
if (t_model.is_preview) {
if (!weakSelf.payBar && weakSelf) {
TFProductionChapterModel *tt_model = [[TFProductionChapterModel alloc] init];
tt_model.production_id = t_model.production_id;
tt_model.chapter_id = t_model.chapter_id;
WXYZ_ChapterBottomPayBar *payBar = [[WXYZ_ChapterBottomPayBar alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) chapterModel:tt_model barType:WXYZ_BottomPayBarTypeBuyChapter productionType:TFProductionTypeComic];
weakSelf.payBar = payBar;
payBar.paySuccessChaptersBlock = ^(NSArray<NSString *> * _Nonnull success_chapter_ids) {
[weakSelf netRequest];
};
payBar.canTouchHiddenView = NO;
[weakSelf.view addSubview:payBar];
[payBar showBottomPayBar];
}
} else {
[weakSelf.payBar hiddenBottomPayBar];
[weakSelf.payBar removeFromSuperview];
weakSelf.payBar = nil;
}
if (t_model.next_chapter > 0) {
[weakSelf.mainTableViewGroup showRefreshFooter];
} else {
[weakSelf.mainTableViewGroup hideRefreshFooter];
}
}
[weakSelf reloadDataSource];
[weakSelf.mainTableViewGroup endRefreshing];
[weakSelf.mainTableViewGroup xtfei_endLoading];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
weakSelf.oldChapterID = -1;
[[TFComicBrowseMenuView sharedManager] stopLoadingData];
[weakSelf.mainTableViewGroup endRefreshing];
[weakSelf.mainTableViewGroup xtfei_endLoading];
}];
[TFNetworkTools POST:Advert_Info parameters:@{@"type" : @"2", @"position" : @"8"} model:TFAdvertModel.class success:^(BOOL isSuccess, TFAdvertModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) {
weakSelf.adModel = t_model;
} failure:nil];
[TFNetworkTools POST:Comic_Add_Read_Log parameters:@{@"comic_id":[TFUtilsHelper formatStringWithInteger:self.comicProductionModel.production_id], @"chapter_id":[TFUtilsHelper formatStringWithInteger:self.chapter_id]} model:nil success:nil failure:nil];
}
// 请求弹幕数据
- (void)requestBarrage {
// 移除当前所有弹幕
[self.barrageList removeAllObjects];
self.totalBarrageArray = @[];
self.currentPageNumber = 1;
self.barrageComplete = NO;
[self.barrageManager.renderView removeAllSubviews];
[self.barrageManager.renderView.animatingCells removeAllObjects];
[self.barrageManager.renderView.idleCells removeAllObjects];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(addNormalBarrage) object:nil];
[self request_Barrage];
}
- (void)request_Barrage {
WS(weakSelf)
if (self.barrageComplete) {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(addNormalBarrage) object:nil];
[self.barrageList removeAllObjects];
self.barrageList = [NSMutableArray arrayWithArray:self.totalBarrageArray];
if (self.barrageList.count > 0) {
if (_barrageManager.renderView.animatingCells.count == 0 && weakSelf.barrageComplete) {
self.barrageManager.renderView.animationStopBlock = ^{
if (weakSelf.barrageManager.renderView.animatingCells.count <= 1) {
[weakSelf addNormalBarrage];
}
};
[weakSelf addNormalBarrage];
} else {
self.barrageManager.renderView.animationStopBlock = ^{
if (weakSelf.barrageManager.renderView.animatingCells.count <= 1 && weakSelf.barrageComplete) {
[weakSelf addNormalBarrage];
}
};
}
}
return;
}
NSDictionary *params = @{
@"comic_id" : @(self.comicProductionModel.production_id),
@"chapter_id" : @(self.chapter_id),
@"page_num" : @(self.currentPageNumber),
};
[TFNetworkTools POST:Comic_Barrage parameters:params model:TFComicBarrageModel.class success:^(BOOL isSuccess, TFComicBarrageModel *_Nullable t_model, TFNetworkRequestModel *requestModel) {
if (isSuccess) {
weakSelf.barrageComplete = t_model.current_page >= t_model.total_page;
[weakSelf.barrageList addObjectsFromArray:t_model.list];
weakSelf.totalBarrageArray = [weakSelf.totalBarrageArray arrayByAddingObjectsFromArray:t_model.list];
[weakSelf addNormalBarrage];
} else {
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:requestModel.msg ?: TFLocalizedString(@"弹幕获取失败")];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[TFPromptManager showPromptWithError:error defaultText:TFLocalizedString(@"请求失败")];
}];
}
- (void)addNormalBarrage {
if (isEnableBarrage == NO) {
return;
}
if ([TFComicBrowseMenuView sharedManager].isShowing) {
[self.barrageManager pause];
}
TFComicBarrageList *t_model = [self barrageModel];
if (!t_model) {
self.currentPageNumber++;
[self request_Barrage];
return;
}
OCBarrageTextDescriptor *textDescriptor = [[OCBarrageTextDescriptor alloc] init];
textDescriptor.text = t_model.content ?: @"";
textDescriptor.textColor = [UIColor colorWithHexString:t_model.color ?: @""];
textDescriptor.positionPriority = OCBarragePositionVeryHigh;
textDescriptor.textFont = [UIFont systemFontOfSize:17.0];
textDescriptor.strokeColor = [[UIColor blackColor] colorWithAlphaComponent:1.0];
textDescriptor.strokeWidth = -1;
textDescriptor.fixedSpeed = 15;
textDescriptor.barrageCellClass = [OCBarrageTextCell class];
if (![TFComicBrowseMenuView sharedManager].isShowing) {
[self.barrageManager renderBarrageDescriptor:textDescriptor];
}
[self performSelector:@selector(addNormalBarrage) afterDelay:0.5];
}
// 获取弹幕内容
- (TFComicBarrageList *)barrageModel {
TFComicBarrageList *t_model = [self.barrageList objectOrNilAtIndex:0];
if (t_model && ![TFComicBrowseMenuView sharedManager].isShowing) {
[self.barrageList removeObject:t_model];
}
return t_model;
}
// 更新弹幕
- (void)changeBarrage:(NSNotification *)noti {
NSString *text = noti.object ?: @"";
TFComicBarrageList *t_model = [[TFComicBarrageList alloc] init];
t_model.content = text;
t_model.color = @"#fdf03e";
[self.barrageList insertObject:t_model atIndex:0];
self.totalBarrageArray = [self.totalBarrageArray arrayByAddingObjectsFromArray:@[t_model]];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(addNormalBarrage) object:nil];
[self addNormalBarrage];
}
- (OCBarrageManager *)barrageManager {
if (!_barrageManager) {
_barrageManager = [[OCBarrageManager alloc] init];
_barrageManager.renderView.backgroundColor = [UIColor clearColor];
_barrageManager.renderView.userInteractionEnabled = NO;
[_barrageManager start];
[self.view insertSubview:_barrageManager.renderView belowSubview:[TFComicBrowseMenuView sharedManager]];
[_barrageManager.renderView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.width.equalTo(self.view);
make.top.equalTo(self.view).offset(kStatusBarHeight);
make.height.equalTo(self.view).multipliedBy(1.0 / 3.0);
}];
}
return _barrageManager;
}
@end