393 lines
15 KiB
Objective-C
393 lines
15 KiB
Objective-C
//
|
|
// WXYZ_MoreView.m
|
|
// WXReader
|
|
//
|
|
// Created by LL on 2020/5/22.
|
|
// Copyright © 2020 Andrew. All rights reserved.
|
|
//
|
|
|
|
#import "WXYZ_MoreView.h"
|
|
|
|
#import "UIView+LayoutCallback.h"
|
|
#import "NSObject+Observer.h"
|
|
#import "TFReaderBookManager.h"
|
|
#import "TFCollectionManager.h"
|
|
|
|
#import "TFNovelDetailViewController.h"
|
|
|
|
#import "TFShareManager.h"
|
|
|
|
#import "TFReadRecordManager.h"
|
|
#import "TFBookMarkModel.h"
|
|
|
|
#import "WXYZ_BookReaderMenuBar.h"
|
|
|
|
@interface WXYZ_MoreCell : UICollectionViewCell
|
|
|
|
- (void)setDict:(NSDictionary <NSString *, NSString *> *)dict;
|
|
|
|
@end
|
|
|
|
typedef NS_ENUM(NSInteger, ReaderBookStyle) {
|
|
ReaderBookDetail = 0,
|
|
ReaderBookMark,
|
|
ReaderBookRack,
|
|
ReaderBookShare,
|
|
};
|
|
|
|
@interface WXYZ_MoreView ()<UICollectionViewDataSource, UICollectionViewDelegate>
|
|
|
|
@property (nonatomic, strong) NSArray<NSDictionary *> *moreDict;
|
|
|
|
@property (nonatomic, weak) UIView *mainView;
|
|
|
|
/// 背景视图
|
|
@property (nonatomic, weak) UIView *emptyView;
|
|
|
|
@property (nonatomic, strong) TFProductionModel *bookModel;
|
|
|
|
@property (nonatomic, strong) TFReaderBookManager *bookManager;
|
|
|
|
/// 书签状态
|
|
@property (nonatomic, assign) BOOL markStatus;
|
|
|
|
/// 书签Model
|
|
@property (nonatomic, strong) TFBookMarkModel *markModel;
|
|
|
|
/// 是不是封面
|
|
@property (nonatomic, assign) BOOL isCover;
|
|
|
|
@end
|
|
|
|
@implementation WXYZ_MoreView
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|
if (self = [super initWithFrame:frame]) {
|
|
[self initialize];
|
|
[self createSubviews];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)initialize {
|
|
self.bookModel = [TFReaderBookManager sharedManager].bookModel;
|
|
self.bookManager = [TFReaderBookManager sharedManager];
|
|
|
|
// 章节内容
|
|
NSString *chapterContent = [self.bookManager getChapterContent];
|
|
// 页面内容
|
|
NSString *pageContent = [self.bookManager getChapterDetailContent];
|
|
|
|
NSRange range = [chapterContent rangeOfString:pageContent];
|
|
|
|
if (self.isCover) {// 封面不能添加书签
|
|
self.markStatus = NO;
|
|
} else {
|
|
// 获取当前章节所有的书签
|
|
NSArray<TFBookMarkModel *> *markArr = [TFReadRecordManager bookMark:[TFUtilsHelper formatStringWithInteger:self.bookManager.book_id] chapterID:[TFUtilsHelper formatStringWithInteger:self.bookManager.chapter_id]];
|
|
for (TFBookMarkModel *t_model in markArr) {
|
|
if (t_model.specificIndex >= range.location && t_model.specificIndex < (range.location + range.length)) {
|
|
self.markModel = t_model;
|
|
self.markStatus = YES;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)createSubviews {
|
|
self.backgroundColor = kBlackTransparentColor;
|
|
[kMainWindow addSubview:self];
|
|
[self mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.edges.equalTo(kMainWindow);
|
|
}];
|
|
|
|
UIView *emptyView = [[UIView alloc] init];
|
|
self.emptyView = emptyView;
|
|
emptyView.backgroundColor = [UIColor clearColor];
|
|
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hide)];
|
|
[emptyView addGestureRecognizer:tap];
|
|
[self addSubview:emptyView];
|
|
[emptyView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.edges.equalTo(self);
|
|
}];
|
|
|
|
UIView *mainView = [[UIView alloc] init];
|
|
self.mainView = mainView;
|
|
mainView.backgroundColor = [UIColor whiteColor];
|
|
mainView.frameBlock = ^(UIView * _Nonnull view) {
|
|
UIBezierPath *corner = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(12.0, 12.0)];
|
|
CAShapeLayer *layer = [CAShapeLayer layer];
|
|
layer.path = corner.CGPath;
|
|
view.layer.mask = layer;
|
|
};
|
|
[self addSubview:mainView];
|
|
[mainView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.equalTo(self.mas_bottom);
|
|
make.left.right.equalTo(self);
|
|
make.height.mas_equalTo(100 + 25 + 25 + PUB_TABBAR_HEIGHT);
|
|
}];
|
|
|
|
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
|
|
flowLayout.estimatedItemSize = CGSizeMake(62.0, 60.0f);
|
|
CGFloat spacing = (SCREEN_WIDTH - (2 * kMargin) - (self.moreDict.count * flowLayout.estimatedItemSize.width)) / (self.moreDict.count - 1);
|
|
spacing = spacing < kMargin ? kMargin : spacing;
|
|
flowLayout.minimumInteritemSpacing = spacing;
|
|
flowLayout.minimumLineSpacing = kMargin;
|
|
|
|
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:flowLayout];
|
|
collectionView.dataSource = self;
|
|
collectionView.delegate = self;
|
|
[collectionView registerClass:[WXYZ_MoreCell class] forCellWithReuseIdentifier:@"Identifier"];
|
|
collectionView.backgroundColor = [UIColor clearColor];
|
|
collectionView.showsVerticalScrollIndicator = NO;
|
|
collectionView.showsHorizontalScrollIndicator = NO;
|
|
[mainView addSubview:collectionView];
|
|
[collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.equalTo(mainView).offset(25);
|
|
make.left.equalTo(mainView).offset(kMargin);
|
|
make.right.equalTo(mainView).offset(- kMargin);
|
|
make.height.mas_equalTo(100);
|
|
}];
|
|
[collectionView addObserver:KEY_PATH(collectionView, contentSize) complete:^(UICollectionView * _Nonnull obj, id _Nullable oldVal, id _Nullable newVal) {
|
|
CGSize size = [newVal CGSizeValue];
|
|
[obj mas_updateConstraints:^(MASConstraintMaker *make) {
|
|
make.height.mas_equalTo(size.height);
|
|
}];
|
|
}];
|
|
|
|
UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
|
[closeButton setTitle:TFLocalizedString(@"关闭") forState:UIControlStateNormal];
|
|
[closeButton setTitleColor:kBlackColor forState:UIControlStateNormal];
|
|
[closeButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, PUB_TABBAR_OFFSET / 2, 0)];
|
|
closeButton.titleLabel.font = kFont16;
|
|
[mainView addSubview:closeButton];
|
|
[closeButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.height.mas_equalTo(PUB_TABBAR_HEIGHT);
|
|
make.left.width.equalTo(mainView);
|
|
make.top.equalTo(collectionView.mas_bottom).offset(25.0f);
|
|
}];
|
|
tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hide)];
|
|
[closeButton addGestureRecognizer:tap];
|
|
|
|
UIView *splitLine = [[UIView alloc] init];
|
|
splitLine.backgroundColor = kGrayLineColor;
|
|
[mainView addSubview:splitLine];
|
|
[splitLine mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.height.mas_equalTo(0.5);
|
|
make.left.width.top.equalTo(closeButton);
|
|
}];
|
|
|
|
[self setNeedsLayout];
|
|
[self layoutIfNeeded];
|
|
}
|
|
|
|
- (void)show {
|
|
[UIView animateWithDuration:kAnimatedDuration animations:^{
|
|
[self.mainView mas_updateConstraints:^(MASConstraintMaker *make) {
|
|
make.top.equalTo(self.mas_bottom).offset(- CGRectGetHeight(self.mainView.frame));
|
|
}];
|
|
[self.mainView.superview layoutIfNeeded];
|
|
}];
|
|
}
|
|
|
|
- (void)hide {
|
|
[UIView animateWithDuration:kAnimatedDuration animations:^{
|
|
[self.mainView mas_updateConstraints:^(MASConstraintMaker *make) {
|
|
make.top.equalTo(self.mas_bottom);
|
|
}];
|
|
[self.mainView.superview layoutIfNeeded];
|
|
} completion:^(BOOL finished) {
|
|
if (finished) {
|
|
[self removeFromSuperview];
|
|
[[WXYZ_BookReaderMenuBar sharedManager] hiddend];
|
|
}
|
|
}];
|
|
}
|
|
|
|
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
|
|
CGPoint emptyPoint = [self convertPoint:point toView:self.mainView];
|
|
if ([self.mainView pointInside:emptyPoint withEvent:event]) {
|
|
return [super hitTest:point withEvent:event];
|
|
} else {
|
|
return self.emptyView;
|
|
}
|
|
}
|
|
|
|
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
|
|
return self.moreDict.count;
|
|
}
|
|
|
|
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
|
WXYZ_MoreCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Identifier" forIndexPath:indexPath];
|
|
[cell setDict:self.moreDict[indexPath.row].allValues.firstObject];
|
|
return cell;
|
|
}
|
|
|
|
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
|
|
NSDictionary *dict = self.moreDict[indexPath.row];
|
|
ReaderBookStyle style = [dict.allKeys.firstObject integerValue];
|
|
|
|
switch (style) {
|
|
case ReaderBookDetail:
|
|
{
|
|
[self hide];
|
|
|
|
UINavigationController *nav = [TFViewHelper getCurrentNavigationController];
|
|
if (nav.viewControllers.count > 1) {
|
|
UIViewController *tmp = nav.viewControllers[nav.viewControllers.count - 2];
|
|
if ([tmp isKindOfClass:TFNovelDetailViewController.class]) {
|
|
[nav popViewControllerAnimated:YES];
|
|
return;
|
|
}
|
|
}
|
|
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification_Reader_Push object:@"TFNovelDetailViewController"];
|
|
}
|
|
break;
|
|
case ReaderBookMark:
|
|
{
|
|
if (self.isCover) {
|
|
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"当前页不支持加书签")];
|
|
return;
|
|
}
|
|
|
|
NSString *pageContent = [self.bookManager getChapterDetailContent];
|
|
if ([pageContent isEqualToString:@"\uFFFC"]) {
|
|
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"当前页不支持加书签")];
|
|
return;
|
|
}
|
|
|
|
NSDictionary *dict = nil;
|
|
if (self.markStatus) {
|
|
// 移除书签
|
|
[TFReadRecordManager removeBookMark:self.markModel];
|
|
dict = @{@(ReaderBookMark) : @{TFLocalizedString(@"添加书签") : @"book_add_mark"}};
|
|
self.markStatus = NO;
|
|
} else {
|
|
// 添加书签
|
|
self.markModel = [TFReadRecordManager addBookMark:[TFUtilsHelper formatStringWithInteger:self.bookManager.book_id] chapterID:[TFUtilsHelper formatStringWithInteger:self.bookManager.chapter_id] chapterSort:self.bookManager.currentChapterIndex chapterTitle:[self.bookManager getChapterTitle] chapterContent:[self.bookManager getChapterContent] pageContent:pageContent];
|
|
dict = @{@(ReaderBookMark) : @{TFLocalizedString(@"取消书签") : @"book_remove_mark"}};
|
|
self.markStatus = YES;
|
|
}
|
|
NSMutableArray<NSDictionary *> *arr = [NSMutableArray arrayWithArray:self.moreDict];
|
|
[arr replaceObjectAtIndex:indexPath.row withObject:dict];
|
|
self.moreDict = [arr copy];
|
|
[collectionView reloadData];
|
|
}
|
|
break;
|
|
case ReaderBookRack:
|
|
{
|
|
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeNovel] isCollectedWithProductionModel:self.bookModel]) break;
|
|
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeNovel] addCollectionWithProductionModel:self.bookModel atIndex:0]) {
|
|
|
|
[TFUtilsHelper synchronizationRackProductionWithProduction_id:self.bookModel.production_id productionType:TFProductionTypeNovel complete:nil];
|
|
|
|
NSDictionary *dict = @{@(ReaderBookRack) : @{TFLocalizedString(@"已加入书架") : @"book_remove_rack"}};
|
|
NSMutableArray<NSDictionary *> *arr = [NSMutableArray arrayWithArray:self.moreDict];
|
|
[arr replaceObjectAtIndex:indexPath.row withObject:dict];
|
|
self.moreDict = [arr copy];
|
|
[collectionView reloadData];
|
|
} else {
|
|
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"添加失败")];
|
|
}
|
|
}
|
|
break;
|
|
case ReaderBookShare:
|
|
{
|
|
[self hide];
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification_Hidden_ToolNav object:nil];
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification_Hidden_Bottom_ToolNav object:nil];
|
|
[TFShareManager shareWithProduction_id:NSStringFromInteger(self.bookModel.production_id) chapter_id:NSStringFromInteger(self.bookManager.chapter_id) type:TFShareTypeBook];
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
};
|
|
}
|
|
|
|
- (NSArray<NSDictionary *> *)moreDict {
|
|
if (!_moreDict) {
|
|
NSMutableArray<NSDictionary *> *arr = [NSMutableArray array];
|
|
|
|
[arr addObject:@{@(ReaderBookDetail) : @{TFLocalizedString(@"书籍详情") : @"book_detail"}}];
|
|
if (self.markStatus) {
|
|
[arr addObject:@{@(ReaderBookMark) : @{TFLocalizedString(@"取消书签") : @"book_remove_mark"}}];
|
|
} else {
|
|
[arr addObject:@{@(ReaderBookMark) : @{TFLocalizedString(@"添加书签") : @"book_add_mark"}}];
|
|
}
|
|
|
|
if ([[TFCollectionManager shareManagerWithProductionType:TFProductionTypeNovel] isCollectedWithProductionModel:self.bookModel]) {
|
|
[arr addObject:@{@(ReaderBookRack) : @{TFLocalizedString(@"已加入书架") : @"book_remove_rack"}}];
|
|
} else {
|
|
[arr addObject:@{@(ReaderBookRack) : @{TFLocalizedString(@"加入书架") : @"book_add_rack"}}];
|
|
}
|
|
[arr addObject:@{@(ReaderBookShare) : @{TFLocalizedString(@"分享") : @"book_share"}}];
|
|
|
|
_moreDict = [arr copy];
|
|
}
|
|
|
|
return _moreDict;
|
|
}
|
|
|
|
- (BOOL)isCover {
|
|
return self.bookManager.currentChapterIndex == 0 && self.bookManager.currentPagerIndex == 0;
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
@implementation WXYZ_MoreCell {
|
|
UIImageView *_coverImageView;
|
|
UILabel *_titleLabel;
|
|
}
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|
if (self = [super initWithFrame:frame]) {
|
|
[self createSubviews];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)createSubviews {
|
|
_coverImageView = [[UIImageView alloc] init];
|
|
_coverImageView.contentMode = UIViewContentModeScaleAspectFill;
|
|
_coverImageView.clipsToBounds = YES;
|
|
_coverImageView.userInteractionEnabled = NO;
|
|
_coverImageView.backgroundColor = [UIColor clearColor];
|
|
[self.contentView addSubview:_coverImageView];
|
|
[_coverImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.left.width.equalTo(self.contentView);
|
|
make.height.equalTo(_coverImageView.mas_width);
|
|
}];
|
|
|
|
_titleLabel = [[UILabel alloc] init];
|
|
_titleLabel.textColor = kBlackColor;
|
|
_titleLabel.font = kFont13;
|
|
_titleLabel.backgroundColor = [UIColor clearColor];
|
|
[self.contentView addSubview:_titleLabel];
|
|
[_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.equalTo(_coverImageView.mas_bottom).offset(14.0f);
|
|
make.centerX.equalTo(self.contentView);
|
|
make.bottom.equalTo(self.contentView).priorityLow();
|
|
}];
|
|
}
|
|
|
|
- (void)setDict:(NSDictionary <NSString *, NSString *> *)dict {
|
|
_coverImageView.image = [UIImage imageNamed:dict.allValues.firstObject];
|
|
_titleLabel.text = dict.allKeys.firstObject ?: @"";
|
|
}
|
|
|
|
- (UICollectionViewLayoutAttributes*)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes*)layoutAttributes {
|
|
[self setNeedsLayout];
|
|
[self layoutIfNeeded];
|
|
CGSize size = [self.contentView systemLayoutSizeFittingSize:layoutAttributes.size];
|
|
CGRect cellFrame = layoutAttributes.frame;
|
|
cellFrame.size.height = size.height;
|
|
layoutAttributes.frame = cellFrame;
|
|
return layoutAttributes;
|
|
}
|
|
|
|
@end
|