TZImagePickerController用法

TZImagePickerController

TZImagePickerController 功能十分强大

#import "TZImagePickerController.h"
#import <Photos/Photos.h>
#import "TZImageManager.h"
#import "TZVideoPlayerController.h"
#import "TZPhotoPreviewController.h"
#import "TZGifPhotoPreviewController.h"
#import "TZLocationManager.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import "FLAnimatedImage.h"
#import "TZImageUploadOperation.h"

使用方法 pod导入框架pod "TZImagePickerController"
导入头文件

#import <TZImagePickerController/TZImagePickerController.h>

1.简单使用

选择图片

         TZImagePickerController *imagePicker = [[TZImagePickerController alloc]initWithMaxImagesCount:self.selectMaxImageCount columnNumber:4 delegate:self pushPhotoPickerVc:YES];
            if (self.selectMaxImageCount >1) {
                imagePicker.selectedAssets = self.selectedAssets;// 目前已经选中的图片数组
            }
         // 是否显示可选原图按钮
           imagePicker.allowPickingOriginalPhoto = NO;
           // 是否允许显示视频
           imagePicker.allowPickingVideo = NO;
           // 是否允许显示图片
           imagePicker.allowPickingImage = YES;
            // 设置是否显示图片序号
            imagePicker.showSelectedIndex = YES;
           // 你可以通过block或者代理,来得到用户选择的照片.
//              [imagePicker setDidFinishPickingPhotosHandle:^(NSArray<UIImage *> *photos, NSArray *assets, BOOL isSelectOriginalPhoto) {
//                  
//              }];
              imagePicker.modalPresentationStyle = UIModalPresentationFullScreen;
              [self presentViewController:imagePicker animated:YES completion:nil];

选择图片代理方法

// 这个照片选择器会自己dismiss,当选择器dismiss的时候,会执行下面的代理方法
// 你也可以设置autoDismiss属性为NO,选择器就不会自己dismis了
// 如果isSelectOriginalPhoto为YES,表明用户选择了原图
// 你可以通过一个asset获得原图,通过这个方法:[[TZImageManager manager] getOriginalPhotoWithAsset:completion:]
// photos数组里的UIImage对象,默认是828像素宽,你可以通过设置photoWidth属性的值来改变它
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray<UIImage *> *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto infos:(NSArray<NSDictionary *> *)infos{
    
    [self.selectedPhotos addObjectsFromArray:photos];
    [self.selectedAssets addObjectsFromArray:assets];
    NSLog(@"====photos:%lu",(unsigned long)self.selectedPhotos.count);
          
    self.headImage.image = self.selectedPhotos.lastObject;
}

选择视频

 //MaxImagesCount  可以选着的最大条目数
           TZImagePickerController *imagePicker = [[TZImagePickerController alloc] initWithMaxImagesCount:2 delegate:self];
           
           // 是否显示可选原图按钮
           imagePicker.allowPickingOriginalPhoto = NO;
           // 是否允许显示视频
           imagePicker.allowPickingVideo = YES;
           // 是否允许显示图片
           imagePicker.allowPickingImage = NO;
           
           // 这是一个navigation 只能present
           // 设置 模态弹出模式。 iOS 13默认非全屏
           imagePicker.modalPresentationStyle = UIModalPresentationFullScreen;
           [self presentViewController:imagePicker animated:YES completion:nil];

选择视频代理方法

// 选择视频回调
// 如果用户选择了一个视频且allowPickingMultipleVideo是NO,下面的代理方法会被执行
// 如果allowPickingMultipleVideo是YES,将会调用imagePickerController:didFinishPickingPhotos:sourceAssets:isSelectOriginalPhoto:
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingVideo:(UIImage *)coverImage sourceAssets:(PHAsset *)asset{
    
}

2.重要属性

2.1 TZImage内部可以拍摄视频和图片 (尽量放在里面做)

allowTakePicture  = YES;
allowTakeVideo = YES;

2.2 选择图片或视频排序

sortAscendingByModificationDate 升序 YES 基本都是升序
showSelectedIndex 显示选择序列号  YES 显示序列号

2.3 gif

allowPickingGif 
NO: gif也显示 就是静止  
YES: 就是可以动的图 且allowTakePicture 必须选择 不然没有图

2.4 选择视频和图片

allowPickingImage
allowPickingVideo
isSelectOriginalPhoto
allowPickingOriginalPhoto
1.选择图片和视频 任意一种或者2种 不能不选择 不然进去啥都没有了
2.选择图片可以配合 isSelectOriginalPhoto 是否选择原图
3.”单独“选择视频  isSelectOriginalPhoto 必须是NO YES没有意义了 

2.5 允许多选视频/GIF/图片

//可以选择视频和图片
allowPickingMultipleVideo

2.6 isSelectOriginalPhoto

allowPickingOriginalPhoto 是否可以选择原图
isSelectOriginalPhoto 默认是不是原图  这里一般都是NO 默认也是NO

2.7 maxImagesCount 是1 单选模式- 裁剪

showSelectBtn = NO; //单选模式才可以NO 而且只针对单选模式有效 就是隐藏

裁剪
allowCrop = YES; //YES和NO不影响选择视频 但是视频也不能裁剪
needCircleCrop //是否是圆形裁剪 YES 则是圆形裁剪 NO 方形
//设置竖屏幕下裁剪尺寸
cropRect 大小 自己设置
scaleAspectFillCrop == YES;
//设置横屏幕下裁剪尺寸
横屏可以不设置 默认是竖屏下的

2.8 默认已经选择的数组

PHAsset *asset
selectedAssets 属性就是可变数组 可变数组放入的PHAsset *类型 

2.9 拍摄时间设置

videoMaximumDuration = 10;//可以录制10s视频
视频拍摄质量videoQuality
[imagePickerVc setUiImagePickerControllerSettingBlock:^(UIImagePickerController *imagePickerController) {
        imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
    }];

2.10 外观设置(一般默认)

//默认就行 那么下面就不需要写了 主题颜色可以设置成项目的
//imagePickerVc.navigationBar.barTintColor = [UIColor greenColor];  
  // imagePickerVc.oKButtonTitleColorDisabled = [UIColor lightGrayColor];     
//imagePickerVc.oKButtonTitleColorNormal = [UIColor greenColor];     
//imagePickerVc.navigationBar.translucent = NO;

//这些需要写
/// icon主题色,默认是微信的绿色,值是r:31 g:185 b:34。目前仅支持showSelectedIndex为YES时的图片选中icon。如需要,请尽早设置它。
imagePickerVc.iconThemeColor = [UIColor colorWithRed:31 / 255.0 green:185 / 255.0 blue:34 / 255.0 alpha:1.0];

/// 默认是NO,如果设置为YES,当照片选择张数达到maxImagesCount时,其它照片会显示颜色为cannotSelectLayerColor的浮层
showPhotoCannotSelectLayer = YES;
//这就是超出数量的浮层
imagePickerVc.cannotSelectLayerColor = [[UIColor whiteColor] colorWithAlphaComponent:0.8];
//设置属性的。比如doneButton 设置红色字体 就是完成字体改成红色 
[imagePickerVc setPhotoPickerPageUIConfigBlock:^(UICollectionView *collectionView, UIView *bottomToolBar, UIButton *previewButton, UIButton *originalPhotoButton, UILabel *originalPhotoLabel, UIButton *doneButton, UIImageView *numberImageView, UILabel *numberLabel, UIView *divideLine) {
        [doneButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    }];
还有自定义导航栏的返回按钮
....很多可以改的 具体看demo和.h

2.11 statusBarStyle(很少用,默认就行)

//     imagePickerVc.isStatusBarDefault = NO;
//    imagePickerVc.statusBarStyle = UIStatusBarStyleLightContent;

2.12 自定义gif播放方案

隐藏与否 选择gif 都会播放 暂时复制下来 以后再看看
[[TZImagePickerConfig sharedInstance] setGifImagePlayBlock:^(TZPhotoPreviewView *view, UIImageView *imageView, NSData *gifData, NSDictionary *info) {
        FLAnimatedImage *animatedImage = [FLAnimatedImage animatedImageWithGIFData:gifData];
        FLAnimatedImageView *animatedImageView;
        for (UIView *subview in imageView.subviews) {
            if ([subview isKindOfClass:[FLAnimatedImageView class]]) {
                animatedImageView = (FLAnimatedImageView *)subview;
                animatedImageView.frame = imageView.bounds;
                animatedImageView.animatedImage = nil;
            }
        }
        if (!animatedImageView) {
            animatedImageView = [[FLAnimatedImageView alloc] initWithFrame:imageView.bounds];
            animatedImageView.runLoopMode = NSDefaultRunLoopMode;
            [imageView addSubview:animatedImageView];
        }
        animatedImageView.animatedImage = animatedImage;
    }];

3.代理方法回调

3.1 用户取消

/// 用户点击了取消
- (void)tz_imagePickerControllerDidCancel:(TZImagePickerController *)picker {
    // NSLog(@"cancel");
}

3.2 asset显示与否 对视频 图片大小做限制的显示(也可以不写)

// 决定照片显示与否
- (BOOL)isAssetCanSelect:(PHAsset *)asset {
    
    switch (asset.mediaType) {
        case PHAssetMediaTypeVideo: {
            // 视频时长
             NSTimeInterval duration = asset.duration;
            if (duration < 1) {
                return NO;
            }
            return YES;
        } break;
        case PHAssetMediaTypeImage: {
            // 图片尺寸
            if (asset.pixelWidth > 3000 || asset.pixelHeight > 3000) {
                // return NO;
            }
            return YES;
        } break;
        case PHAssetMediaTypeAudio:
            return NO;
            break;
        case PHAssetMediaTypeUnknown:
            return NO;
            break;
        default: break;
    }
    
    return YES;
}

3.3 相册是否显示

// 决定相册显示与否 albumName:相册名字 result:相册原始数据
- (BOOL)isAlbumCanSelect:(NSString *)albumName result:(PHFetchResult *)result {
    /*
    if ([albumName isEqualToString:@"个人收藏"]) {
        return NO;
    }
    if ([albumName isEqualToString:@"视频"]) {
        return NO;
    }*/
    return YES;
}

3.4 图片回调

/ 这个照片选择器会自己dismiss,当选择器dismiss的时候,会执行下面的代理方法
// 你也可以设置autoDismiss属性为NO,选择器就不会自己dismis了
// 如果isSelectOriginalPhoto为YES,表明用户选择了原图
// 你可以通过一个asset获得原图,通过这个方法:[[TZImageManager manager] getOriginalPhotoWithAsset:completion:]
// photos数组里的UIImage对象,默认是828像素宽,你可以通过设置photoWidth属性的值来改变它
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray<UIImage *> *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto infos:(NSArray<NSDictionary *> *)infos{
    NSLog(@"图片回调");
    [self.selectedPhotos addObjectsFromArray:photos];
    [self.selectedAssets addObjectsFromArray:assets];
    NSLog(@"====photos:%lu",(unsigned long)self.selectedPhotos.count);
          
    //刷新数据
    ......


}

3.5 视频回调

// 选择视频回调
// 如果用户选择了一个视频且allowPickingMultipleVideo是NO,下面的代理方法会被执行
// 如果allowPickingMultipleVideo是YES,将会调用imagePickerController:didFinishPickingPhotos:sourceAssets:isSelectOriginalPhoto:
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingVideo:(UIImage *)coverImage sourceAssets:(PHAsset *)asset{
    NSLog(@"视频回调");
    [self.selectedPhotos addObjectsFromArray: @[coverImage]];
    [self.selectedAssets addObjectsFromArray:@[asset]];
// open this code to send video / 打开这段代码发送视频
    [[TZImageManager manager] getVideoOutputPathWithAsset:asset presetName:AVAssetExportPresetLowQuality success:^(NSString *outputPath) {
        // NSData *data = [NSData dataWithContentsOfFile:outputPath];
        NSLog(@"视频导出到本地完成,沙盒路径为:%@",outputPath);
        // Export completed, send video here, send by outputPath or NSData
        // 导出完成,在这里写上传代码,通过路径或者通过NSData上传
    } failure:^(NSString *errorMessage, NSError *error) {
        NSLog(@"视频导出失败:%@,error:%@",errorMessage, error);
    }];
    //刷新数据
   ......

}

3.6 GIF回调

// 选择gif图片回调
// 如果用户选择了一个gif图片且allowPickingMultipleVideo是NO,下面的代理方法会被执行
// 如果allowPickingMultipleVideo是YES,将会调用imagePickerController:didFinishPickingPhotos:sourceAssets:isSelectOriginalPhoto:
//1.如果allowPickingMultipleVideo 是YES allowPickingGif 是YES 那么都不会走视频的回调 gif回调 全部都是图片回调 具体显示cell 还是需要判断asset
//2.判断是视频asset.mediaType != PHAssetMediaTypeVideo
//3.判断是gif [[asset valueForKey:@"filename"] containsString:@"GIF"]
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingGifImage:(UIImage *)animatedImage sourceAssets:(PHAsset *)asset{
NSLog(@"git回调");
   [self.selectedPhotos addObjectsFromArray: @[animatedImage]];
    [self.selectedAssets addObjectsFromArray:@[asset]];
    
}

3.7 查看已选择的图片

//单独查看一张gif图
TZGifPhotoPreviewController *vc = [[TZGifPhotoPreviewController alloc] init];
            TZAssetModel *model = [TZAssetModel modelWithAsset:asset type:TZAssetModelMediaTypePhotoGif timeLength:@""];
            vc.model = model;
            [self presentViewController:vc animated:YES completion:nil];

//单独查看一个视频
TZVideoPlayerController *vc = [[TZVideoPlayerController alloc] init];
            TZAssetModel *model = [TZAssetModel modelWithAsset:asset type:TZAssetModelMediaTypeVideo timeLength:@""];
            vc.model = model;
            [self presentViewController:vc animated:YES completion:nil];

//这是最全的  首先 可以多选视频/gif /图片 然后可以传入是否原图 然后点击取消 点击选择 然后完成 就可以回调最新的数据源 
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithSelectedAssets:_selectedAssets selectedPhotos:_selectedPhotos index:indexPath.item];
//这个参数大致传入就可以
imagePickerVc.maxImagesCount = self.maxCountTF.text.integerValue;
//是否可以gif
imagePickerVc.allowPickingGif = YES;
//是否可以原图
imagePickerVc.allowPickingOriginalPhoto = YES;
//是否可以展示视频
imagePickerVc.allowPickingMultipleVideo = YES;
//是否显示下标
imagePickerVc.showSelectedIndex = self.showSelectedIndexSwitch.
//是否默认就选择原图
imagePickerVc.isSelectOriginalPhoto = _isSelectOriginalPhoto;

 [imagePickerVc setDidFinishPickingPhotosHandle:^(NSArray<UIImage *> *photos, NSArray *assets, BOOL isSelectOriginalPhoto) {
                NSLog(@"回调:%ld,%ld",photos.count,assets.count);
 }];
[self presentViewController:imagePickerVc animated:YES completion:nil];
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容