// // 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 *)dict; @end typedef NS_ENUM(NSInteger, ReaderBookStyle) { ReaderBookDetail = 0, ReaderBookMark, ReaderBookRack, ReaderBookShare, }; @interface WXYZ_MoreView () @property (nonatomic, strong) NSArray *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 *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 *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 *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 *)moreDict { if (!_moreDict) { NSMutableArray *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 *)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