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.
		
		
		
		
		
			
		
			
				
					
					
						
							392 lines
						
					
					
						
							15 KiB
						
					
					
				
			
		
		
	
	
							392 lines
						
					
					
						
							15 KiB
						
					
					
				| // | |
| //  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
 | |
| 
 |