OC IOS 文件解压缩预览

热很。。热很。。。。夏天的城市只有热浪没有情怀。。。

来吧,come on。。。

 引用第三方库:

pod 'SSZipArchive'

开发实现:

一、控制器实现

头文件控制器定义:

//
//  ZipRarViewController.h
//
//  Created by carbonzhao on 2024/5/28.
//#import "IMBaseClassViewController.h"NS_ASSUME_NONNULL_BEGIN@interface ZipRarViewController : IMBaseClassViewController//可为本地路径,亦可为远端路径
@property (nonatomic,strong) NSURL *filePath;//路径标记,相同标记解压过的不再解压
@property (nonatomic,strong) NSString *fileFlag;@endNS_ASSUME_NONNULL_END

实现文件定义:

//
//  ZipRarViewController.m
//
//  Created by carbonzhao on 2024/5/28.
//#import "ZipRarViewController.h"
#import "SSZipArchive.h"
#import "UIBreadView.h"NS_ASSUME_NONNULL_BEGIN@interface UINextTreeView : UIView
{
}
- (void)setDataSource:(NSMutableArray*)list checkActionBlock:(void (^)(NSDictionary *e))checkActionBlock;
@endNS_ASSUME_NONNULL_ENDtypedef void (^SubTreeViewCheckedTreeBlock)(NSDictionary *e);@interface UINextTreeView ()<UITableViewDelegate,UITableViewDataSource>
{NSMutableArray *dataList;UITableView *tview;
}
@property (nonatomic,copy) SubTreeViewCheckedTreeBlock ClickTreeBlock;
@end@implementation UINextTreeView- (instancetype)initWithFrame:(CGRect)frame
{if (self = [super initWithFrame:frame]){[self setupUI];}return self;
}- (void)setFrame:(CGRect)frame
{[super setFrame:frame];if (tview){[tview setFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];}
}- (void)setupUI
{dataList = [[NSMutableArray alloc] initWithCapacity:0];tview = [[UITableView alloc] initWithFrame:self.bounds];tview.backgroundColor = DSTextPlaceColor;tview.dataSource = self;tview.delegate = self;
//    tview.tableFooterView = [UIView new];tview.separatorColor = [UIColor clearColor];tview.estimatedRowHeight = 0;tview.estimatedSectionFooterHeight = 0;tview.estimatedSectionHeaderHeight = 0;[tview setShowsVerticalScrollIndicator:NO];[tview setShowsHorizontalScrollIndicator:NO];
//    [tview setBackgroundColor:[UIColor redColor]];
//    tview.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
//        [weakSelf getListAllDing:@"refresh"];
//    }];[self addSubview:tview];
}#pragma mark - action
- (void)setDataSource:(NSMutableArray*)list checkActionBlock:(void (^)(NSDictionary *e))checkActionBlock
{[self setClickTreeBlock:checkActionBlock];[dataList addObjectsFromArray:list];[tview reloadData];
}- (void)reloadView
{dispatch_async(dispatch_get_main_queue(), ^{[self->tview reloadData];});
}- (NSString *)docIcon:(NSString *)ext
{NSString *ex = [ext lowercaseString];if ([@[@"xls",@"xlsx"] containsObject:ex]){return @"icon_excel_new";}else if ([@[@"doc",@"docx"] containsObject:ex]){return @"icon_word_new";}else if ([@[@"pdf"] containsObject:ex]){return @"icon_pdf_new";}else if ([@[@"txt"] containsObject:ex]){return @"icon_txt_new";}else if ([@[@"png",@"jpg",@"jpeg"] containsObject:ex]){return @"icon_img_new";}else if ([@[@"mov",@"mp4",@"avi",@"mpeg",@"mkv",@"3gp",@"wmv",@"rmvb"] containsObject:ex]){return @"icon_mp4_new";}else if ([@[@"mp3",@"wav"] containsObject:ex]){return @"icon_mp3";}else if ([@[@"zip",@"rar"] containsObject:ex]){return @"icon_zip_new";}return @"";
}#pragma mark - tableView
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{return 1;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return dataList.count;
}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{CGFloat height = 58;return height;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];CGFloat height = [self tableView:tableView heightForRowAtIndexPath:indexPath];if (height > 0){CGFloat x = 20;NSMutableDictionary *e = [dataList objectAtIndex:indexPath.row];kWeakSelf(self)NSString *dicon = [e boolForKey:@"isDir"]?@"icon_folder_icon":[self docIcon:[e stringForKey:@"ext"]];CGRect rt = CGRectMake(x, (height-30)/2, 30, 30);UIImageView *dirIcon = [[UIImageView alloc] initWithFrame:rt];[dirIcon setImage:IMAGE_INIM_NAME(dicon)];[cell.contentView addSubview:dirIcon];x += (rt.size.width + 10);NSString *name = [e stringForKey:@"fileName"];rt = CGRectMake(x, 0, tableView.frame.size.width-20-x-40, height);UILabel *label = [[UILabel alloc] initWithFrame:rt];[label setFont:Font_size(16)];[label setTextColor:RGBA(10, 10, 10, 1)];[label setText:name];[label setTextAlignment:NSTextAlignmentLeft];[cell.contentView addSubview:label];if ([e boolForKey:@"isDir"]){rt = CGRectMake(tableView.width-34, (height-14)/2, 14, 14);UIImageView *iconView = [[UIImageView alloc] initWithFrame:rt];[iconView setImage:IMAGE_INIM_NAME(@"icon_arrow")];[cell.contentView addSubview:iconView];}rt = CGRectMake(25, height-1, tableView.frame.size.width-25, 1);UIImageView *iconView = [[UIImageView alloc] initWithFrame:rt];[iconView setBackgroundColor:RGB(245, 245, 245)];[cell.contentView addSubview:iconView];rt = CGRectMake(0, 0, tableView.frame.size.width, height);iconView = [[UIImageView alloc] initWithFrame:rt];[iconView setBackgroundColor:RGB(245, 245, 245)];[cell setSelectedBackgroundView:iconView];}[cell setSelectionStyle:UITableViewCellSelectionStyleNone];return cell;
}- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{[tableView deselectRowAtIndexPath:indexPath animated:YES];NSMutableDictionary *e = [dataList objectAtIndex:indexPath.row];self.ClickTreeBlock(e);
}
@end@interface ZipRarViewController ()
@property (nonatomic,strong) UIBreadView *breview;
@end@implementation ZipRarViewController- (instancetype)init
{if (self = [super init]){}return self;
}- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.breview = [UIBreadView breadViewWithFrame:CGRectMake(0, 0, ScreenWidth, self.safeAreaHeight) viewType:UIBreadViewBreadType];[self.view addSubview:self.breview];NSString *fileName = [self.filePath lastPathComponent]; //获取文件名称[self setTitle:[NSString stringWithFormat:@"%@预览",fileName]];if ([self.filePath.absoluteString hasPrefix:@"http"]){WeakSelf(self);[self showToastWithKeepAliveBlock:^(UIToastFenceView *waitView) {[waitView setViewMode:UIToastFenceViewModeCircle];[waitView setTitleText:@"下载中..."];NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];NSURLRequest *request = [NSURLRequest requestWithURL:self.filePath];NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress *downloadProgress){CGFloat completedUnitCount = downloadProgress.completedUnitCount*1.0;CGFloat totalUnitCount = downloadProgress.totalUnitCount*1.0;CGFloat percent = completedUnitCount/totalUnitCount;[waitView setProgress:percent];if (percent == 1.0){[waitView setViewMode:UIToastFenceViewModeText];[waitView setTitleText:@"下载完成"];[waitView dismiss:1.5];}} destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {NSURL *url = [NSURL fileURLWithPath:userDocuments(@"docPathFile", fileName)];return url;} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {if (error) {[waitView setViewMode:UIToastFenceViewModeText];[waitView setTitleText:@"下载失败"];[waitView dismiss:1.5];}else {[waitView dismiss];NSURL *url = [NSURL fileURLWithPath:userDocuments(@"docPathFile", fileName)];weakSelf.filePath = url;[weakSelf toReadySource];}}];[downloadTask resume];}];}else{[self toReadySource];}
}#pragma mark - 解压文件
- (void)toReadySource
{NSString *path = [self.filePath path];NSString *fileName = [[[self.filePath lastPathComponent] componentsSeparatedByString:@"."] firstObject];NSString *to = userDocuments(@"zipsPathFile", @"");to = [to stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_%@",self.fileFlag,fileName]];WeakSelf(self);
//    [[NSFileManager defaultManager] removeItemAtPath:to error:nil];if ([[NSFileManager defaultManager] fileExistsAtPath:to]){[self showToastBlock:^(UIToastFenceView *waitView) {[weakSelf readFiles:[to stringByAppendingPathComponent:fileName] fileName:fileName];}];}else{[self showToastBlock:^(UIToastFenceView *waitView){[waitView setTitleText:@"解压中..."];BOOL flag = [SSZipArchive unzipFileAtPath:path toDestination:to];if (flag){[weakSelf readFiles:[to stringByAppendingPathComponent:fileName] fileName:fileName];}else{[waitView setTitleText:@"解压失败"];[waitView waitForSeconds];}}];}
}- (void)readFiles:(NSString *)path fileName:(NSString *)fileName
{NSMutableArray *list = [NSMutableArray arrayWithCapacity:0];NSFileManager *fm = [NSFileManager defaultManager];NSArray *subFilePath = [fm contentsOfDirectoryAtPath:path error:nil];for (NSString * fileName in subFilePath){if (![fileName isEqualToString:@".DS_Store"]){NSMutableDictionary *e = [[NSMutableDictionary alloc] initWithCapacity:0];[e setObject:path forKey:@"path"];[e setObject:fileName forKey:@"fileName"];BOOL isDir = NO;[fm fileExistsAtPath:[path stringByAppendingPathComponent:fileName] isDirectory: &isDir];[e setObject:boolToStr(isDir) forKey:@"isDir"];[e setObject:[fileName pathExtension] forKey:@"ext"];[list addObject:e];}}WeakSelf(self);dispatch_sync_on_main_queue(^{NSBreadData *d = [[NSBreadData alloc] init];[d setTitle:fileName];[self.breview addBreadViewTitle:d withConfigBlock:^UIView * _Nullable(NSInteger index, BOOL * _Nonnull useAnimation){UINextTreeView *b = [[UINextTreeView alloc] init];[b setDataSource:list checkActionBlock:^(NSDictionary *e) {NSString *p = [e stringForKey:@"path"];NSString *n = [e stringForKey:@"fileName"];if ([e boolForKey:@"isDir"]){p = [p stringByAppendingPathComponent:n];[weakSelf readFiles:p fileName:n];}else{if (weakSelf.delegateBlock){weakSelf.delegateBlock(e);}}}];return b;}];});
}
@end

二、面包屑实现(控制器内部实现切换子页面视图)

头文件源码:

//
//  UIBreadView.h
//
//  Copyright © 2021 dtx. All rights reserved.
//#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface NSBreadData : NSObject
@property (nonatomic,strong) NSString *title;
@endtypedef NS_ENUM(NSInteger,UIBreadViewType){UIBreadViewBreadType=0, //面包屑模式,默认UIBreadViewSearchType,  //搜索模式UIBreadViewHyborType,   //混合模式(面包屑搜索均显示)
};@interface UIBreadView : UIView//仅有一个面包屑及动画切换的容器
+ (UIBreadView *)breadViewWithFrame:(CGRect)frame viewType:(UIBreadViewType)viewType;//有一个面包屑及动画切换的容器及可添加的不进行动画切换的容器
+ (UIBreadView *)breadViewWithFrame:(CGRect)frame viewType:(UIBreadViewType)viewType positionFixView:(UIView * (^)(void))positionFixView;- (void)addBreadViewTitle:(NSBreadData *)data withConfigBlock:(UIView* _Nullable (^)(NSInteger index,BOOL *useAnimation)) setupBlock;//block返回YES,则隐藏面包屑
- (void)registerSelectActionBlock:(BOOL (^)(NSInteger index))actionBlock;- (void)registerSearchKeywordBlock:(void (^)(NSString *keyword,BOOL willResign))aBlock;//搜索UI自定义
- (void)registerConfigurationSearchInterfaceBlock:(void (^)(UIView *pview))aBlock;- (BOOL)canPopToOneView;
- (CGFloat)breadNavigatorHeight;
- (CGFloat)breadNavigatory;- (void)setHiddenNavigatorBreadHidden:(BOOL)flag;- (UIView *)parentView:(UIView *)selfView;
- (UIView *)currentView;- (void)resignSearchFieldResponder;- (void)setReturnKeyType:(UIReturnKeyType)type;
//面包屑清除数据回归初始状态
- (void)breadcrumbClearingData;
@endNS_ASSUME_NONNULL_END

实现文件:

//
//  UIBreadView.m
//  Copyright © 2021 dtx. All rights reserved.
//#import "UIBreadView.h"
#import "NSExtentionSloter.h"
#import "SearchBarDisplayCenter.h"
#import "imHeaders.h"typedef BOOL (^UIBreadViewActionBlock)(NSInteger index);typedef void (^UIBreadViewSearchKeywordBlock)(NSString *keyword,BOOL willResign);@interface NSBreadData ()
@property (nonatomic,assign) BOOL isSelected;@property (nonatomic,assign) CGFloat itemWidth;//如果有sourceView,则内部处理点击事件切换页面,如果无,将事件反馈到控制器处理
@property (nonatomic,weak) UIView *sourceView;
@end@implementation NSBreadData
@synthesize title,sourceView,itemWidth,isSelected;
@end@interface UIBreadView ()<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,SearchBarDisplayCenterDelegate>
{UICollectionView *textView;UIView *contentView;NSInteger lastHiglightedRow;NSMutableArray *dataList;
}@property (nonatomic,copy) UIBreadViewActionBlock actionBlock;@property (nonatomic,copy) UIBreadViewSearchKeywordBlock searchBlock;//是否显示搜索组件进行搜索,如果显示了搜索则不再显示面包屑
@property (nonatomic,assign) UIBreadViewType viewWorkType;@property (nonatomic,strong) UIView *fixedContainerView;@property (nonatomic, strong) UIImageView *sepView;
@end@implementation UIBreadView
@synthesize actionBlock,viewWorkType;+ (UIBreadView *)breadViewWithFrame:(CGRect)frame viewType:(UIBreadViewType)viewType
{UIBreadView *view = [[UIBreadView alloc] initWithFrame:frame];[view setViewWorkType:viewType];[view setupUI];return view;
}+ (UIBreadView *)breadViewWithFrame:(CGRect)frame viewType:(UIBreadViewType)viewType positionFixView:(UIView * (^)(void))positionFixView
{UIBreadView *view = [[UIBreadView alloc] initWithFrame:frame];[view setViewWorkType:viewType];if (positionFixView){UIView *fview = positionFixView();[view setFixedContainerView:fview];}[view setupUI];return view;
}- (instancetype)initWithFrame:(CGRect)frame
{if (self = [super initWithFrame:frame]){self->lastHiglightedRow = -1;self.viewWorkType = UIBreadViewBreadType;}return self;
}- (void)setFrame:(CGRect)frame
{[super setFrame:frame];CGRect rt = contentView.frame;rt.size.height = frame.size.height-rt.origin.y;[contentView setFrame:rt];for (UIView *aview in contentView.subviews){[aview setFrame:CGRectMake(0, 0, frame.size.width, rt.size.height)];}
}- (void)setupUI{dataList = [[NSMutableArray alloc] initWithCapacity:0];CGRect rt = CGRectMake(20, 0, self.bounds.size.width-40, 44);UICollectionViewFlowLayout *flowLayout=[[UICollectionViewFlowLayout alloc] init];[flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];textView = [[UICollectionView alloc] initWithFrame:rt collectionViewLayout:flowLayout];
//    textView.backgroundColor = [UIColor yellowColor];[textView setDelegate:self];[textView setDataSource:self];
//    [textView setPagingEnabled:YES];[textView setBackgroundColor:[UIColor clearColor]];[textView setShowsHorizontalScrollIndicator:NO];[textView setShowsVerticalScrollIndicator:NO];[textView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"dequeueIdentifier"];[self addSubview:textView];CGFloat y = rt.origin.y+rt.size.height;if (self.viewWorkType == UIBreadViewSearchType){[textView setHidden:YES];CGRect rt = CGRectMake(0, 0, ScreenWidth, 50);UIView *header = [[UIView alloc]initWithFrame:rt];header.backgroundColor = [UIColor whiteColor];[header setTag:404];[self addSubview:header];SearchBarDisplayCenter *searchBar = [[SearchBarDisplayCenter alloc]initWithFrame:CGRectMake(0, 3, ScreenWidth, 47)];searchBar.userInteractionEnabled = YES;searchBar.placeholderStr = @"搜索";[searchBar breadChangeFrameAndSearchIcon];//        searchBar.seachIconIV.image = [UIImage imageInImBundle:@"bread_search"];
//        
//        [searchBar.seachIconIV mas_updateConstraints:^(MASConstraintMaker *make) {
//          
//            make.width.mas_equalTo(17);
//            make.height.mas_equalTo(17);
//        }];
//
//        searchBar.placeholderColor = colorFromText(@"#999999");[searchBar setTag:405];searchBar.backgroundColor = [UIColor whiteColor];[searchBar setDelegate:self];[header addSubview:searchBar];y = rt.origin.y+rt.size.height;}else if (self.viewWorkType == UIBreadViewHyborType){rt = CGRectMake(0, 0, ScreenWidth, 50);UIView *header = [[UIView alloc]initWithFrame:rt];header.backgroundColor = [UIColor whiteColor];[header setTag:404];[self addSubview:header];SearchBarDisplayCenter *searchBar = [[SearchBarDisplayCenter alloc]initWithFrame:CGRectMake(0, 3, ScreenWidth, 47)];[searchBar setTag:405];searchBar.userInteractionEnabled = YES;searchBar.placeholderStr = @"搜索";[searchBar breadChangeFrameAndSearchIcon];[searchBar setDelegate:self];[header addSubview:searchBar];y = rt.origin.y+rt.size.height;rt = textView.frame;rt.origin.y = y;[textView setFrame:rt];y = rt.origin.y+rt.size.height;}[textView setDataObject:NSStringFromCGRect(textView.frame)];rt = CGRectMake(0, y, self.bounds.size.width, 10);UIImageView *sepView = [[UIImageView alloc] initWithFrame:rt];self.sepView = sepView;[sepView setBackgroundColor:DSTextPlaceColor];[self addSubview:sepView];y = rt.origin.y+rt.size.height;if (self.fixedContainerView){rt = self.fixedContainerView.frame;rt.origin.y = y;[self.fixedContainerView setFrame:rt];[self addSubview:self.fixedContainerView];y = rt.origin.y+rt.size.height;}rt = CGRectMake(0, y, self.bounds.size.width, self.bounds.size.height- (rt.origin.y+rt.size.height));contentView = [[UIView alloc] initWithFrame:rt];[contentView setBackgroundColor:[UIColor whiteColor]];[contentView setTag:90001];[self addSubview:contentView];
}- (void)addBreadViewTitle:(NSBreadData *)data withConfigBlock:(UIView* _Nullable (^)(NSInteger index,BOOL *useAnimation)) setupBlock
{WeakSelf(self);__weak typeof(dataList) thisDataList = dataList;__weak typeof(textView) thisTextView = textView;__weak typeof(contentView) thisContentView = contentView;[textView performBatchUpdates:^{CGFloat w = [data.title stringSizeWithFont:[UIFont systemFontOfSize:14]].width;if (thisDataList.count > 0){w += 28;}data.itemWidth = w;[data setIsSelected:NO];[thisDataList addObject:data];[thisTextView insertItemsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:thisDataList.count-1 inSection:0]]];if (thisDataList.count > 1){NSBreadData *e = [thisDataList objectAtIndex:thisDataList.count-2];[e setIsSelected:YES];self->lastHiglightedRow = thisDataList.count-3;if (self->lastHiglightedRow > -1){
//                e = [dataList objectAtIndex:lastHiglightedRow];
//                [e setIsSelected:NO];
//
//                [textView reloadItemsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:lastHiglightedRow inSection:0]]];}[thisTextView reloadItemsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:thisDataList.count-2 inSection:0]]];}} completion:^(BOOL finished) {}];if (setupBlock){NSInteger count = contentView.subviews.count;
//        for (NSInteger idx=0;idx<contentView.subviews.count;idx++)
//        {
//            UIView *view = [contentView.subviews objectAtIndex:idx];
//            CGRect rt = view.frame;
//            rt.origin.x = - (count-idx)*self.bounds.size.width;
//            [view setFrame:rt];
//        }BOOL useAnimation = YES;UIView *view = setupBlock(count,&useAnimation);__weak typeof(view) thisView = view;data.sourceView = view;if (view){CGRect rt = view.frame;rt.origin.x = thisContentView.subviews.count>0?weakSelf.bounds.size.width:0;rt.size = thisContentView.frame.size;[view setFrame:rt];[thisContentView addSubview:thisView];if (thisContentView.subviews.count>0){if (useAnimation){[UIView animateWithDuration:0.3 animations:^{CGRect rt = thisView.frame;rt.origin.x = 0;[thisView setFrame:rt];}completion:^(BOOL finished){}];}else{CGRect rt = thisView.frame;rt.origin.x = 0;[thisView setFrame:rt];}}}}NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self->dataList.count-1 inSection:0];[self->textView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionRight animated:YES];
};- (void)setReturnKeyType:(UIReturnKeyType)type
{SearchBarDisplayCenter *searchBar = [[self viewWithTag:404] viewWithTag:405];searchBar.searchField.returnKeyType = type;
}- (UIView *)parentView:(UIView *)selfView
{NSInteger index = [contentView.subviews indexOfObject:selfView];if (index > 0){return [contentView.subviews objectAtIndex:index-1];}return nil;
}- (UIView *)currentView
{return [contentView.subviews lastObject];
}- (void)registerSelectActionBlock:(BOOL (^)(NSInteger index))actionBlock
{[self setActionBlock:actionBlock];
}- (void)registerSearchKeywordBlock:(void (^)(NSString *keyword,BOOL willResign))aBlock
{[self setSearchBlock:aBlock];
}- (void)registerConfigurationSearchInterfaceBlock:(void (^)(UIView *pview))aBlock
{SearchBarDisplayCenter *searchBar = [[self viewWithTag:404] viewWithTag:405];CGRect ft = searchBar.frame;UIView *aview = [[UIView alloc] initWithFrame:ft];[aview setUserInteractionEnabled:YES];[[self viewWithTag:404] addSubview:aview];aBlock(aview);
}- (CGSize)itemSizeWithIndex:(NSIndexPath *)indexPath{NSBreadData *data = [dataList objectAtIndex:indexPath.row];CGFloat w = data.itemWidth;return CGSizeMake(w+5, textView.frame.size.height);
}- (void)setHiddenNavigatorBreadHidden:(BOOL)flag
{if (textView.isHidden != flag){[textView setHidden:flag];if (flag){[UIView animateWithDuration:0.3 animations:^{CGRect rt = self->textView.frame;rt.origin.y = -rt.size.height;[self->textView setFrame:rt];CGFloat y = 0;if ([self viewWithTag:404]){y = [self viewWithTag:404].frame.origin.y+[self viewWithTag:404].frame.size.height;}rt = CGRectMake(0, y, self.bounds.size.width, 5);[self.sepView setFrame:rt];y += 5;rt = CGRectMake(0, y, self.bounds.size.width, self.bounds.size.height-y);[self->contentView setFrame:rt];}completion:^(BOOL finished){CGRect rt = self->textView.frame;rt.origin.x = self.bounds.size.width;rt.origin.y = 0;[self->textView setFrame:rt];}];}else{[UIView animateWithDuration:0.3 animations:^{CGRect rt = self->textView.frame;rt.origin.x = 20;rt.origin.y = CGRectFromString((NSString *)[self->textView dataObject]).origin.y;[self->textView setFrame:rt];CGFloat y = rt.origin.y+rt.size.height;rt = CGRectMake(0, y, self.bounds.size.width, 5);[self.sepView setFrame:rt];y += 5;rt = CGRectMake(0, y, self.bounds.size.width, self.bounds.size.height-y);[self->contentView setFrame:rt];}completion:^(BOOL finished){}];}}for (UIView *aview in contentView.subviews){[aview setFrame:CGRectMake(0, 0, contentView.size.width, contentView.size.height)];}
}- (BOOL)canPopToOneView
{BOOL flag = NO;if (dataList.count==0) {return flag;}NSBreadData *mObject = [dataList lastObject];if (mObject.sourceView && dataList.count>1){flag = YES;[self poptoOneViewWithAnimation:dataList.count-2];}return flag;
}- (CGFloat)breadNavigatorHeight
{if (self.viewWorkType == UIBreadViewSearchType){return MAX(textView.frame.size.height, [self viewWithTag:404].frame.size.height);}else if (self.viewWorkType == UIBreadViewHyborType){return textView.frame.size.height+[self viewWithTag:404].frame.size.height;}else{return textView.frame.size.height;}
}- (CGFloat)breadNavigatory
{return [self viewWithTag:404].frame.origin.y+[self viewWithTag:404].frame.size.height;
}- (void)resignSearchFieldResponder
{SearchBarDisplayCenter *searchBar = [[self viewWithTag:404] viewWithTag:405];[searchBar restoreInitialState];[searchBar.searchField resignFirstResponder];[self poptoOneViewWithAnimation:1];
}- (void)poptoOneViewWithAnimation:(NSInteger)row
{if (self.actionBlock){BOOL flag =  self.actionBlock(row);[self setHiddenNavigatorBreadHidden:flag];}NSBreadData *mObject = [dataList objectAtIndex:row];if (mObject.sourceView){for (NSInteger ix=dataList.count-1; ix>row;ix--){NSBreadData *mObject = [dataList objectAtIndex:ix];UIView *aview = mObject.sourceView;[UIView animateWithDuration:0.3 animations:^{CGRect rt = aview.frame;rt.origin.x = self.bounds.size.width;[aview setFrame:rt];}completion:^(BOOL finished){[aview removeFromSuperview];}];}[dataList removeObjectsInRange:NSMakeRange(row+1, dataList.count- (row+1))];NSBreadData *m = [dataList lastObject];[m setIsSelected:NO];if (dataList.count > 1){m = [dataList objectAtIndex:dataList.count-2];[m setIsSelected:YES];}if (textView){[textView reloadSections:[NSIndexSet indexSetWithIndex:0]];}}}- (void)breadcrumbClearingData {if (self.actionBlock){BOOL flag =  self.actionBlock(0);[self setHiddenNavigatorBreadHidden:flag];}if (dataList.count > 0) {
//        for (NSInteger ix=0; ix>dataList.count;ix++)
//        {
//            NSBreadData *mObject = [dataList objectAtIndex:ix];
//            UIView *aview = mObject.sourceView;
//                [aview removeFromSuperview];
//        }[dataList removeAllObjects];}if (textView){[textView reloadSections:[NSIndexSet indexSetWithIndex:0]];}
}
#pragma mark - SearchBarDisplayCenterDelegate
- (void)getSearchKeyWordWhenChanged:(NSString *)searchWord
{if (self.searchBlock){self.searchBlock(searchWord,NO);}
}- (void)textFieldBecomeResponder:(NSString*)text
{if (self.searchBlock){self.searchBlock(text,NO);}
}- (void)textFieldResignResponder:(NSString*)text
{if (self.searchBlock){self.searchBlock(text,YES);}
}#pragma mark - UICollectionView
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{return 1;
}- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{NSInteger count = dataList.count;return count;
}- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
{return 0;
}- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
{return 0;
}- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{return [self itemSizeWithIndex:indexPath];
}// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"dequeueIdentifier" forIndexPath:indexPath];[cell.contentView setBackgroundColor:[UIColor clearColor]];CGSize size = [self itemSizeWithIndex:indexPath];NSBreadData *mObject = [dataList objectAtIndex:indexPath.row];CGFloat x = 5;if (indexPath.row>0){CGRect rt = CGRectMake(x, (size.height-10)/2, 10, 10);UIImageView *iconView = [cell.contentView viewWithTag:90];if (!iconView){iconView = [[UIImageView alloc] initWithFrame:rt];[iconView setImage:IMAGE_INIM_NAME(@"bookList_xiayiye")];[iconView setTag:90];[cell.contentView addSubview:iconView];}if (mObject.isSelected){[iconView setTintColor:RGB(0, 125, 255)];}x += rt.size.width;}[[cell.contentView viewWithTag:90] setHidden:indexPath.row == 0];CGRect rt = CGRectMake(x, 0, size.width-x, size.height);UIButton *button = [cell.contentView viewWithTag:91];if (!button){button = [UIButton buttonWithType:UIButtonTypeCustom];[button setTag:91];[button.titleLabel setFont:[UIFont systemFontOfSize:14]];[button setTitleColor:RGB(40, 40, 40) forState:UIControlStateNormal];[button setTitleColor:RGB(0, 125, 255) forState:UIControlStateSelected];[cell.contentView addSubview:button];}[button setUserInteractionEnabled:NO];[button setFrame:rt];[button setTitle:mObject.title forState:UIControlStateNormal];[button setDataObject:mObject];[button setSelected:mObject.isSelected];[cell setBackgroundColor:[UIColor clearColor]];return cell;
}- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
//    UICollectionViewCell *cell = [contentView cellForItemAtIndexPath:indexPath];[self poptoOneViewWithAnimation:indexPath.row];
}
@end

完毕,相关的资源文件自己寻找整理,这里就不贴了,相关的一些个人开发依赖,有兴趣的同学可以留言找我要! 

三、使用

ZipRarViewController *c = [[ZipRarViewController alloc] init];
//传入压缩包路径,支持本地文件及远程文件URL
[c setFilePath:url];
//文中路径进行MD5,目的是区分记录解压记录,已解压过的后期不再解压而是直接读取展示
[c setFileFlag:[fileFlag md5Byte32Lower]];
[c setDelegateBlock:^(NSDictionary *data) {NSString *p = [data stringForKey:@"path"];NSString *f = [data stringForKey:@"fileName"];weakSelf.fileURL = [NSURL fileURLWithPath:[p                 stringByAppendingPathComponent:f]];[weakSelf openDocument:weakSelf.fileURL];
}];
[self.navigationController pushViewController:c animated:YES];//打开文件方法
- (void)openDocument:(NSURL *)url {if ([QLPreviewController canPreviewItem:url]) {dispatch_async(dispatch_get_main_queue(), ^{[weakSelf initKkpreview];});}
}- (void)initKkpreview {self.kkpreview = [[QLPreviewController alloc] init];self.kkpreview.delegate = self;self.kkpreview.dataSource = self;WeakSelf(self);UIView *rview = [UINaviButton naviButtonWithActionBlock:^{[weakSelf.kkpreview.navigationController popViewControllerAnimated:YES];}];UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithCustomView:rview];self.kkpreview.navigationItem.leftBarButtonItem = item;[self.navigationController pushViewController:self.kkpreview animated:YES];
}#pragma mark - QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller{return 1;
}- (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index{return  self.fileURL;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/337347.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

更新mirh connect 内置derby数据库密码

更新mirh connect 内置derby数据库密码 1、下载derby连接客户端 https://archive.apache.org/dist/db/derby/ 选择任意版本即可&#xff0c;比如 https://archive.apache.org/dist/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.zip 2、连接mirh文件数据库 1、把mi…

12 FreeRTOS 调试与优化

1、调试 1.1 打印 在FreeRTOS工程中使用了microlib&#xff0c;里面实现了printf函数。 只需要实现一下以下函数即可使用printf。 int fputc(int ch; FILE *f); 假如要从串口实现打印函数&#xff1a; int fputc( int ch, FILE *f ) {//指定串口USART_TypeDef* USARTx USAR…

黑马一站制造数仓实战2

问题 DG连接问题 原理&#xff1a;JDBC&#xff1a;用Java代码连接数据库 Hive/SparkSQL&#xff1a;端口有区别 可以为同一个端口&#xff0c;只要不在同一台机器 项目&#xff1a;一台机器 HiveServer&#xff1a;10000 hiveserver.port 10000 SparkSQL&#xff1a;10001…

如何克隆非默认分支

直接git clone下来的我们知道是默认分支&#xff0c;那如何克隆其他分支呢&#xff1a; 比如这个&#xff0c;我们想克隆AdvNet。 我们可以在本地文件夹打开Git Bash 依次输入&#xff1a; git clone --branch AdvNet https://github.com/wgcban/SemiCD.git cd SemiCD git b…

Java基础入门day62

day62 AJAX 概念 AJAX&#xff1a; Asynchronous Javascript And XML AJAX是一种无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术 AJAX是一种用于创建快速动态网页的技术 通过在后台与服务器进行少量数据交换&#xff0c;AJAX可以使网页实现异步更新 传统…

源码编译安装LAMP(安装apeche mysql php 论坛 网站 巨详细版)

目录 一.LAMP架构相关概述 1.各组件作用 Linux&#xff08;平台&#xff09; Apache&#xff08;前台&#xff09; MySQL&#xff08;后台&#xff09; PHP/Perl/Python&#xff08;中间连接&#xff09; 总结 二.编译安装Apache httpd服务 1.关闭防火墙&#xff0c;将…

docker一键部署EFK系统(elasticsearch filebeat kibana metricbeat es-head)

EFK日志系统搭建 EFK日志系统介绍功能需求搭建elasticsearch集群规划前提部署核对证书及权限 EFK日志系统介绍 Elasticsearch 是一个实时的、分布式的可扩展的搜索引擎&#xff0c;允许进行全文、结构化搜索&#xff0c;它通常用于索引和搜索大量日志数据&#xff0c;也可用于…

【计算机网络】——物理层(图文并茂)

物理层 一.物理层概述1.物理层要实现的功能2.物理层接口特征1.机械特性2.电气特性3.功能特性4.过程特性 二.物理层下面的传输媒体1.传输媒体的分类2.导向型传输媒体1.同轴电缆2.双绞线3.光纤 3.非导向型传输媒体1.无线电波2.微波3.红外线4.激光5.可见光 三.传输方式1.串行传输与…

Kali : 安装Google Chrome 浏览器和ChromeDriver

目录 一、安装Google Chrome 浏览器 1、下载Google Chrome 2、安装Chrome 3、安装依赖包 二、安装ChromeDriver 1、查看Chrome版本 ​2、下载ChromeDriver 3、解压下载包 4、设置全局访问 5、赋予可执行权限 6、验证chromedriver 7、程序测试 一、安装Google Chrom…

Kafka系列之高频面试题

基础 简介 特点&#xff1a; 高吞吐、低延迟&#xff1a;kafka每秒可以处理几十万条消息&#xff0c;延迟最低只有几毫秒&#xff0c;每个Topic可以分多个Partition&#xff0c;Consumer Group对Partition进行Consumer操作可扩展性&#xff1a;Kafka集群支持热扩展持久性、可…

WEB攻防-JAVAWEB项目常见漏洞

知识点 1.JavaWeb常见安全及代码逻辑 2.目录遍历&身份验证&逻辑&JWT 3.访问控制&安全组件&越权&三方组件 本篇主要了解以上问题在javaweb中的呈现&#xff0c; 第一个重点理解URL与javaweb代码框架的对应方式&#xff0c;java在没有代码的情况下是很难…

【R基础】如何开始学习R-从下载R及Rstudio开始

文章目录 概要下载R流程下载Rstudio流程下载完成-打开 概要 提示&#xff1a;如何开始学习R-从下载R及Rstudio开始&#xff0c;此处我只是想下载指定版本R4.3.3 下载R流程 链接: R官网 文件下载到本地 下载文件展示 按照向导指示安装 下载Rstudio流程 链接: Rstudio官网…

hadoop(1)--hdfs部署(亲测可用)

一、准备&#xff1a; 1、三台集群部署&#xff0c;配置hosts #cat /etc/hosts 192.168.46.128 node1 #nameNode dataNode secondaryNameNode 192.168.46.129 node2 #datanode 192.168.46.130 node3 #datanode说明&#xff1a; NameNode: 主节点管理者 DataNode&…

把自己的服务器添加到presearch节点

Presearch is a scam. Before, judging by the price of the token you should have been able to get between $150-$200 after 12-13 months of regular searches. "If you use this service for the next 11 years you will have earned $30!" Presearch大约需要…

11.1 排序算法

目录 11.1 排序算法 11.1.1 评价维度 11.1.2 理想排序算法 11.1 排序算法 排序算法&#xff08;sorting algorithm&#xff09;用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更高效地查找、分析和处理。 如图 1…

STM32—按键控制LED(定时器)

目录 1 、 电路构成及原理图 2 、编写实现代码 main.c exit.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 EXTI&#xff08;External interrupt/event controller&#xff…

Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

C 基础 - 预处理命令和基本语法详解

#include <stdio.h> //预处理指令int main() //函数 {printf("Hello, World!"); //输出语句return 0; //返回语句 } 目录 一.预处理指令 1.#define #ifdef #ifndef #if #else #elif #endif 2.#inlcude a.新增一个文件 b.#include c.运行结果 d.扩…

云计算与 openstack

文章目录 一、 虚拟化二、云计算2.1 IT系统架构的发展2.2 云计算2.3 云计算的服务类型 三、Openstack3.1 OpenStack核心组件 一、 虚拟化 虚拟化使得在一台物理的服务器上可以跑多台虚拟机&#xff0c;虚拟机共享物理机的 CPU、内存、IO 硬件资源&#xff0c;但逻辑上虚拟机之…

基于单片机的恒流开关电源 BUCK电路设计

1 前言 1.1课题研究意义 开关电源顾名思义&#xff0c;开关电源便是使用半导体开关器件&#xff08;如晶体管、场效应管、可控硅闸流管等&#xff09;&#xff0c;经过控制电路&#xff0c;使半导体开关器件不停地“导通”和“关闭”&#xff0c;让半导体开关器件对输入的电压…