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.
 

435 lines
17 KiB

//
// 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