Unverified Commit 863bcade authored by hanl001's avatar hanl001 Committed by GitHub

Merge pull request #1 from banchichen/master

pr
parents 4c6b2c1b 2b182e65
...@@ -22,7 +22,8 @@ ...@@ -22,7 +22,8 @@
## 一. Installation 安装 ## 一. Installation 安装
#### CocoaPods #### CocoaPods
> pod 'TZImagePickerController' > pod 'TZImagePickerController' #iOS8 and later
> pod 'TZImagePickerController', '2.2.6' #iOS6、iOS7
#### Carthage #### Carthage
> github "banchichen/TZImagePickerController" > github "banchichen/TZImagePickerController"
...@@ -50,6 +51,13 @@ ...@@ -50,6 +51,13 @@
如果运行在iOS6或7系统上,用的是AssetsLibrary库获取照片资源。 如果运行在iOS6或7系统上,用的是AssetsLibrary库获取照片资源。
如果运行在iOS8及以上系统上,用的是PhotoKit库获取照片资源。 如果运行在iOS8及以上系统上,用的是PhotoKit库获取照片资源。
TZImagePickerController uses Camera、Location、Microphone、Photo Library,you need add these properties to info.plist like Demo:
TZImagePickerController使用了相机、定位、麦克风、相册,请参考Demo添加下列属性到info.plist文件:
`Privacy - Camera Usage Description`
`Privacy - Location When In Use Usage Description`
`Privacy - Microphone Usage Description`
`Privacy - Photo Library Usage Description`
## 四. More 更多 ## 四. More 更多
If you find a bug, please create a issue. If you find a bug, please create a issue.
...@@ -76,8 +84,8 @@ A:请参考issue457的解释:https://github.com/banchichen/TZImagePickerCont ...@@ -76,8 +84,8 @@ A:请参考issue457的解释:https://github.com/banchichen/TZImagePickerCont
**Q:系统语言是中文/英文,界面上却有部分相册名字、返回按钮显示成了英文/中文?** **Q:系统语言是中文/英文,界面上却有部分相册名字、返回按钮显示成了英文/中文?**
A:请参考 https://github.com/banchichen/TZImagePickerController/issues/443 和 https://github.com/banchichen/TZImagePickerController/issues/929 A:请参考 https://github.com/banchichen/TZImagePickerController/issues/443 和 https://github.com/banchichen/TZImagePickerController/issues/929
**Q:预览界面能否支持传入NSURL、UIImage对象?** **Q:预览界面能否支持传入NSURL、UIImage对象?**
A:排期中,优先级高 A:3.0.1版本已支持,需新接一个库:[TZImagePreviewController](https://github.com/banchichen/TZImagePreviewController),请参考里面的Demo使用。
**Q:设置可选视频的最大/最小时长?照片的最小/最大尺寸?不符合要求的不显示** **Q:设置可选视频的最大/最小时长?照片的最小/最大尺寸?不符合要求的不显示**
A:可以的,参照Demo的isAssetCanSelect方法实现。我会返回asset出来,显示与否你来决定,注意这个是一个同步方法,对于需要根据asset去异步获取的信息如视频的大小、视频是否存在iCloud里来过滤的,无法做到。如果真要这样做,相册打开速度会变慢,你需要改我源码。 A:可以的,参照Demo的isAssetCanSelect方法实现。我会返回asset出来,显示与否你来决定,注意这个是一个同步方法,对于需要根据asset去异步获取的信息如视频的大小、视频是否存在iCloud里来过滤的,无法做到。如果真要这样做,相册打开速度会变慢,你需要改我源码。
...@@ -120,6 +128,8 @@ A:视频导出分两步,第一步是通过PHAsset获取AVURLAsset,如是iC ...@@ -120,6 +128,8 @@ A:视频导出分两步,第一步是通过PHAsset获取AVURLAsset,如是iC
## 六. Release Notes 最近更新 ## 六. Release Notes 最近更新
3.0.4 优化保存照片、视频的方法
3.0.1 新增对[TZImagePreviewController](https://github.com/banchichen/TZImagePreviewController)库的支持,允许预览UIImage、NSURL、PHAsset对象
**3.0.0 去除iOS6和7的适配代码,更轻量,最低支持iOS8** **3.0.0 去除iOS6和7的适配代码,更轻量,最低支持iOS8**
2.2.6 新增needFixComposition属性,默认为NO,不再主动修正视频转向,防止部分安卓拍的视频导出失败(**最后一个支持iOS6和7的版本** 2.2.6 新增needFixComposition属性,默认为NO,不再主动修正视频转向,防止部分安卓拍的视频导出失败(**最后一个支持iOS6和7的版本**
2.1.5 修复开启showSelectedIndex后照片列表页iCloud图片进度条紊乱的bug 2.1.5 修复开启showSelectedIndex后照片列表页iCloud图片进度条紊乱的bug
......
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = "TZImagePickerController" s.name = "TZImagePickerController"
s.version = "3.0.0" s.version = "3.0.4"
s.summary = "A clone of UIImagePickerController, support picking multiple photos、original photo and video" s.summary = "A clone of UIImagePickerController, support picking multiple photos、original photo and video"
s.homepage = "https://github.com/banchichen/TZImagePickerController" s.homepage = "https://github.com/banchichen/TZImagePickerController"
s.license = "MIT" s.license = "MIT"
s.author = { "banchichen" => "tanzhenios@foxmail.com" } s.author = { "banchichen" => "tanzhenios@foxmail.com" }
s.platform = :ios s.platform = :ios
s.ios.deployment_target = "8.0" s.ios.deployment_target = "8.0"
s.source = { :git => "https://github.com/banchichen/TZImagePickerController.git", :tag => "3.0.0" } s.source = { :git => "https://github.com/banchichen/TZImagePickerController.git", :tag => "3.0.4" }
s.requires_arc = true s.requires_arc = true
s.resources = "TZImagePickerController/TZImagePickerController/*.{png,bundle}" s.resources = "TZImagePickerController/TZImagePickerController/*.{png,bundle}"
s.source_files = "TZImagePickerController/TZImagePickerController/*.{h,m}" s.source_files = "TZImagePickerController/TZImagePickerController/*.{h,m}"
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>3.0.0</string> <string>3.0.4</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
......
...@@ -75,12 +75,12 @@ ...@@ -75,12 +75,12 @@
- (void)getOriginalPhotoDataWithAsset:(PHAsset *)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion; - (void)getOriginalPhotoDataWithAsset:(PHAsset *)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion;
/// Save photo 保存照片 /// Save photo 保存照片
- (void)savePhotoWithImage:(UIImage *)image completion:(void (^)(NSError *error))completion; - (void)savePhotoWithImage:(UIImage *)image completion:(void (^)(PHAsset *asset, NSError *error))completion;
- (void)savePhotoWithImage:(UIImage *)image location:(CLLocation *)location completion:(void (^)(NSError *error))completion; - (void)savePhotoWithImage:(UIImage *)image location:(CLLocation *)location completion:(void (^)(PHAsset *asset, NSError *error))completion;
/// Save video 保存视频 /// Save video 保存视频
- (void)saveVideoWithUrl:(NSURL *)url completion:(void (^)(NSError *error))completion; - (void)saveVideoWithUrl:(NSURL *)url completion:(void (^)(PHAsset *asset, NSError *error))completion;
- (void)saveVideoWithUrl:(NSURL *)url location:(CLLocation *)location completion:(void (^)(NSError *error))completion; - (void)saveVideoWithUrl:(NSURL *)url location:(CLLocation *)location completion:(void (^)(PHAsset *asset, NSError *error))completion;
/// Get video 获得视频 /// Get video 获得视频
- (void)getVideoWithAsset:(PHAsset *)asset completion:(void (^)(AVPlayerItem * playerItem, NSDictionary * info))completion; - (void)getVideoWithAsset:(PHAsset *)asset completion:(void (^)(AVPlayerItem * playerItem, NSDictionary * info))completion;
...@@ -111,6 +111,11 @@ ...@@ -111,6 +111,11 @@
/// 判断asset是否是视频 /// 判断asset是否是视频
- (BOOL)isVideo:(PHAsset *)asset; - (BOOL)isVideo:(PHAsset *)asset;
/// for TZImagePreviewController
- (NSString *)getNewTimeFromDurationSecond:(NSInteger)duration;
- (TZAssetModel *)createModelWithAsset:(PHAsset *)asset;
@end @end
//@interface TZSortDescriptor : NSSortDescriptor //@interface TZSortDescriptor : NSSortDescriptor
......
...@@ -457,17 +457,19 @@ static dispatch_once_t onceToken; ...@@ -457,17 +457,19 @@ static dispatch_once_t onceToken;
#pragma mark - Save photo #pragma mark - Save photo
- (void)savePhotoWithImage:(UIImage *)image completion:(void (^)(NSError *error))completion { - (void)savePhotoWithImage:(UIImage *)image completion:(void (^)(PHAsset *asset, NSError *error))completion {
[self savePhotoWithImage:image location:nil completion:completion]; [self savePhotoWithImage:image location:nil completion:completion];
} }
- (void)savePhotoWithImage:(UIImage *)image location:(CLLocation *)location completion:(void (^)(NSError *error))completion { - (void)savePhotoWithImage:(UIImage *)image location:(CLLocation *)location completion:(void (^)(PHAsset *asset, NSError *error))completion {
__block NSString *localIdentifier = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
if (@available(iOS 9, *)) { if (@available(iOS 9, *)) {
NSData *data = UIImageJPEGRepresentation(image, 0.9); NSData *data = UIImageJPEGRepresentation(image, 0.9);
PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init]; PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];
options.shouldMoveFile = YES; options.shouldMoveFile = YES;
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset]; PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];
localIdentifier = request.placeholderForCreatedAsset.localIdentifier;
[request addResourceWithType:PHAssetResourceTypePhoto data:data options:options]; [request addResourceWithType:PHAssetResourceTypePhoto data:data options:options];
if (location) { if (location) {
request.location = location; request.location = location;
...@@ -475,6 +477,7 @@ static dispatch_once_t onceToken; ...@@ -475,6 +477,7 @@ static dispatch_once_t onceToken;
request.creationDate = [NSDate date]; request.creationDate = [NSDate date];
} else { } else {
PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
localIdentifier = request.placeholderForCreatedAsset.localIdentifier;
if (location) { if (location) {
request.location = location; request.location = location;
} }
...@@ -483,11 +486,12 @@ static dispatch_once_t onceToken; ...@@ -483,11 +486,12 @@ static dispatch_once_t onceToken;
} completionHandler:^(BOOL success, NSError *error) { } completionHandler:^(BOOL success, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
if (success && completion) { if (success && completion) {
completion(nil); PHAsset *asset = [[PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil] firstObject];
completion(asset, nil);
} else if (error) { } else if (error) {
NSLog(@"保存照片出错:%@",error.localizedDescription); NSLog(@"保存照片出错:%@",error.localizedDescription);
if (completion) { if (completion) {
completion(error); completion(nil, error);
} }
} }
}); });
...@@ -496,16 +500,18 @@ static dispatch_once_t onceToken; ...@@ -496,16 +500,18 @@ static dispatch_once_t onceToken;
#pragma mark - Save video #pragma mark - Save video
- (void)saveVideoWithUrl:(NSURL *)url completion:(void (^)(NSError *error))completion { - (void)saveVideoWithUrl:(NSURL *)url completion:(void (^)(PHAsset *asset, NSError *error))completion {
[self saveVideoWithUrl:url location:nil completion:completion]; [self saveVideoWithUrl:url location:nil completion:completion];
} }
- (void)saveVideoWithUrl:(NSURL *)url location:(CLLocation *)location completion:(void (^)(NSError *error))completion { - (void)saveVideoWithUrl:(NSURL *)url location:(CLLocation *)location completion:(void (^)(PHAsset *asset, NSError *error))completion {
__block NSString *localIdentifier = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
if (@available(iOS 9, *)) { if (@available(iOS 9, *)) {
PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init]; PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];
options.shouldMoveFile = YES; options.shouldMoveFile = YES;
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset]; PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];
localIdentifier = request.placeholderForCreatedAsset.localIdentifier;
[request addResourceWithType:PHAssetResourceTypeVideo fileURL:url options:options]; [request addResourceWithType:PHAssetResourceTypeVideo fileURL:url options:options];
if (location) { if (location) {
request.location = location; request.location = location;
...@@ -513,6 +519,7 @@ static dispatch_once_t onceToken; ...@@ -513,6 +519,7 @@ static dispatch_once_t onceToken;
request.creationDate = [NSDate date]; request.creationDate = [NSDate date];
} else { } else {
PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url]; PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url];
localIdentifier = request.placeholderForCreatedAsset.localIdentifier;
if (location) { if (location) {
request.location = location; request.location = location;
} }
...@@ -521,11 +528,12 @@ static dispatch_once_t onceToken; ...@@ -521,11 +528,12 @@ static dispatch_once_t onceToken;
} completionHandler:^(BOOL success, NSError *error) { } completionHandler:^(BOOL success, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
if (success && completion) { if (success && completion) {
completion(nil); PHAsset *asset = [[PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil] firstObject];
completion(asset, nil);
} else if (error) { } else if (error) {
NSLog(@"保存视频出错:%@",error.localizedDescription); NSLog(@"保存视频出错:%@",error.localizedDescription);
if (completion) { if (completion) {
completion(error); completion(nil, error);
} }
} }
}); });
...@@ -734,6 +742,14 @@ static dispatch_once_t onceToken; ...@@ -734,6 +742,14 @@ static dispatch_once_t onceToken;
return asset.mediaType == PHAssetMediaTypeVideo; return asset.mediaType == PHAssetMediaTypeVideo;
} }
- (TZAssetModel *)createModelWithAsset:(PHAsset *)asset {
TZAssetModelMediaType type = [[TZImageManager manager] getAssetType:asset];
NSString *timeLength = type == TZAssetModelMediaTypeVideo ? [NSString stringWithFormat:@"%0.0f",asset.duration] : @"";
timeLength = [[TZImageManager manager] getNewTimeFromDurationSecond:timeLength.integerValue];
TZAssetModel *model = [TZAssetModel modelWithAsset:asset type:type timeLength:timeLength];
return model;
}
/// 获取优化后的视频转向信息 /// 获取优化后的视频转向信息
- (AVMutableVideoComposition *)fixedCompositionWithAsset:(AVAsset *)videoAsset { - (AVMutableVideoComposition *)fixedCompositionWithAsset:(AVAsset *)videoAsset {
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
// //
// Created by 谭真 on 15/12/24. // Created by 谭真 on 15/12/24.
// Copyright © 2015年 谭真. All rights reserved. // Copyright © 2015年 谭真. All rights reserved.
// version 3.0.0 - 2018.08.23 // version 3.0.4 - 2018.09.04
// 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController // 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController
/* /*
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
// //
// Created by 谭真 on 15/12/24. // Created by 谭真 on 15/12/24.
// Copyright © 2015年 谭真. All rights reserved. // Copyright © 2015年 谭真. All rights reserved.
// version 3.0.0 - 2018.08.23 // version 3.0.4 - 2018.09.04
// 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController // 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController
#import "TZImagePickerController.h" #import "TZImagePickerController.h"
...@@ -432,7 +432,8 @@ ...@@ -432,7 +432,8 @@
[_progressHUD addSubview:_HUDContainer]; [_progressHUD addSubview:_HUDContainer];
} }
[_HUDIndicatorView startAnimating]; [_HUDIndicatorView startAnimating];
[[UIApplication sharedApplication].keyWindow addSubview:_progressHUD]; [[UIApplication sharedApplication].delegate.window addSubview:_progressHUD];
[self.view setNeedsLayout];
// if over time, dismiss HUD automatic // if over time, dismiss HUD automatic
__weak typeof(self) weakSelf = self; __weak typeof(self) weakSelf = self;
...@@ -645,9 +646,11 @@ ...@@ -645,9 +646,11 @@
- (void)viewDidLayoutSubviews { - (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews]; [super viewDidLayoutSubviews];
_HUDContainer.frame = CGRectMake((self.view.tz_width - 120) / 2, (self.view.tz_height - 90) / 2, 120, 90); CGFloat progressHUDY = CGRectGetMaxY(self.navigationBar.frame);
_progressHUD.frame = CGRectMake(0, progressHUDY, self.view.tz_width, self.view.tz_height - progressHUDY);
_HUDContainer.frame = CGRectMake((self.view.tz_width - 120) / 2, (_progressHUD.tz_height - 90 - progressHUDY) / 2, 120, 90);
_HUDIndicatorView.frame = CGRectMake(45, 15, 30, 30); _HUDIndicatorView.frame = CGRectMake(45, 15, 30, 30);
_HUDLabel.frame = CGRectMake(0,40, 120, 50); _HUDLabel.frame = CGRectMake(0,40, 120, 50);
} }
#pragma mark - Public #pragma mark - Public
......
...@@ -787,9 +787,9 @@ static CGFloat itemMargin = 5; ...@@ -787,9 +787,9 @@ static CGFloat itemMargin = 5;
[imagePickerVc showProgressHUD]; [imagePickerVc showProgressHUD];
UIImage *photo = [info objectForKey:UIImagePickerControllerOriginalImage]; UIImage *photo = [info objectForKey:UIImagePickerControllerOriginalImage];
if (photo) { if (photo) {
[[TZImageManager manager] savePhotoWithImage:photo location:self.location completion:^(NSError *error){ [[TZImageManager manager] savePhotoWithImage:photo location:self.location completion:^(PHAsset *asset, NSError *error){
if (!error) { if (!error) {
[self reloadPhotoArrayWithMediaType:type]; [self addPHAsset:asset];
} }
}]; }];
self.location = nil; self.location = nil;
...@@ -799,9 +799,9 @@ static CGFloat itemMargin = 5; ...@@ -799,9 +799,9 @@ static CGFloat itemMargin = 5;
[imagePickerVc showProgressHUD]; [imagePickerVc showProgressHUD];
NSURL *videoUrl = [info objectForKey:UIImagePickerControllerMediaURL]; NSURL *videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];
if (videoUrl) { if (videoUrl) {
[[TZImageManager manager] saveVideoWithUrl:videoUrl location:self.location completion:^(NSError *error) { [[TZImageManager manager] saveVideoWithUrl:videoUrl location:self.location completion:^(PHAsset *asset, NSError *error) {
if (!error) { if (!error) {
[self reloadPhotoArrayWithMediaType:type]; [self addPHAsset:asset];
} }
}]; }];
self.location = nil; self.location = nil;
...@@ -809,55 +809,47 @@ static CGFloat itemMargin = 5; ...@@ -809,55 +809,47 @@ static CGFloat itemMargin = 5;
} }
} }
- (void)reloadPhotoArrayWithMediaType:(NSString *)mediaType { - (void)addPHAsset:(PHAsset *)asset {
TZAssetModel *assetModel = [[TZImageManager manager] createModelWithAsset:asset];
TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController; TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController;
[[TZImageManager manager] getCameraRollAlbum:tzImagePickerVc.allowPickingVideo allowPickingImage:tzImagePickerVc.allowPickingImage needFetchAssets:NO completion:^(TZAlbumModel *model) { [tzImagePickerVc hideProgressHUD];
self->_model = model; if (tzImagePickerVc.sortAscendingByModificationDate) {
[[TZImageManager manager] getAssetsFromFetchResult:self->_model.result completion:^(NSArray<TZAssetModel *> *models) { [_models addObject:assetModel];
[tzImagePickerVc hideProgressHUD]; } else {
[_models insertObject:assetModel atIndex:0];
TZAssetModel *assetModel; }
if (tzImagePickerVc.maxImagesCount <= 1) {
if (tzImagePickerVc.allowCrop && asset.mediaType == PHAssetMediaTypeImage) {
TZPhotoPreviewController *photoPreviewVc = [[TZPhotoPreviewController alloc] init];
if (tzImagePickerVc.sortAscendingByModificationDate) { if (tzImagePickerVc.sortAscendingByModificationDate) {
assetModel = [models lastObject]; photoPreviewVc.currentIndex = _models.count - 1;
[self->_models addObject:assetModel];
} else { } else {
assetModel = [models firstObject]; photoPreviewVc.currentIndex = 0;
[self->_models insertObject:assetModel atIndex:0];
} }
photoPreviewVc.models = _models;
if (tzImagePickerVc.maxImagesCount <= 1) { [self pushPhotoPrevireViewController:photoPreviewVc];
if (tzImagePickerVc.allowCrop) { } else {
TZPhotoPreviewController *photoPreviewVc = [[TZPhotoPreviewController alloc] init]; [tzImagePickerVc addSelectedModel:assetModel];
if (tzImagePickerVc.sortAscendingByModificationDate) { [self doneButtonClick];
photoPreviewVc.currentIndex = self->_models.count - 1; }
} else { return;
photoPreviewVc.currentIndex = 0; }
}
photoPreviewVc.models = self->_models; if (tzImagePickerVc.selectedModels.count < tzImagePickerVc.maxImagesCount) {
[self pushPhotoPrevireViewController:photoPreviewVc]; if (assetModel.type == TZAssetModelMediaTypeVideo && !tzImagePickerVc.allowPickingMultipleVideo) {
} else { // 不能多选视频的情况下,不选中拍摄的视频
[tzImagePickerVc addSelectedModel:assetModel]; } else {
[self doneButtonClick]; assetModel.isSelected = YES;
} [tzImagePickerVc addSelectedModel:assetModel];
return; [self refreshBottomToolBarStatus];
} }
}
if (tzImagePickerVc.selectedModels.count < tzImagePickerVc.maxImagesCount) { _collectionView.hidden = YES;
if ([mediaType isEqualToString:@"public.movie"] && !tzImagePickerVc.allowPickingMultipleVideo) { [_collectionView reloadData];
// 不能多选视频的情况下,不选中拍摄的视频
} else { _shouldScrollToBottom = YES;
assetModel.isSelected = YES; [self scrollCollectionViewToBottom];
[tzImagePickerVc addSelectedModel:assetModel];
[self refreshBottomToolBarStatus];
}
}
self->_collectionView.hidden = YES;
[self->_collectionView reloadData];
self->_shouldScrollToBottom = YES;
[self scrollCollectionViewToBottom];
}];
}];
} }
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
......
...@@ -383,24 +383,19 @@ ...@@ -383,24 +383,19 @@
} }
if (_tzImagePickerVc.allowCrop) { // 裁剪状态 if (_tzImagePickerVc.allowCrop) { // 裁剪状态
_doneButton.enabled = NO; _doneButton.enabled = NO;
TZImagePickerController *rootVc = self.navigationController; [_tzImagePickerVc showProgressHUD];
[rootVc showProgressHUD];
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:_currentIndex inSection:0]; NSIndexPath *indexPath = [NSIndexPath indexPathForItem:_currentIndex inSection:0];
TZPhotoPreviewCell *cell = (TZPhotoPreviewCell *)[_collectionView cellForItemAtIndexPath:indexPath]; TZPhotoPreviewCell *cell = (TZPhotoPreviewCell *)[_collectionView cellForItemAtIndexPath:indexPath];
dispatch_async(dispatch_get_global_queue(0, 0), ^{ UIImage *cropedImage = [TZImageCropManager cropImageView:cell.previewView.imageView toRect:_tzImagePickerVc.cropRect zoomScale:cell.previewView.scrollView.zoomScale containerView:self.view];
UIImage *cropedImage = [TZImageCropManager cropImageView:cell.previewView.imageView toRect:_tzImagePickerVc.cropRect zoomScale:cell.previewView.scrollView.zoomScale containerView:self.view]; if (_tzImagePickerVc.needCircleCrop) {
if (_tzImagePickerVc.needCircleCrop) { cropedImage = [TZImageCropManager circularClipImage:cropedImage];
cropedImage = [TZImageCropManager circularClipImage:cropedImage]; }
} _doneButton.enabled = YES;
dispatch_async(dispatch_get_main_queue(), ^{ [_tzImagePickerVc hideProgressHUD];
_doneButton.enabled = YES; if (self.doneButtonClickBlockCropMode) {
[rootVc hideProgressHUD]; TZAssetModel *model = _models[_currentIndex];
if (self.doneButtonClickBlockCropMode) { self.doneButtonClickBlockCropMode(cropedImage,model.asset);
TZAssetModel *model = _models[_currentIndex]; }
self.doneButtonClickBlockCropMode(cropedImage,model.asset);
}
});
});
} else if (self.doneButtonClickBlock) { // 非裁剪状态 } else if (self.doneButtonClickBlock) { // 非裁剪状态
self.doneButtonClickBlock(_isSelectOriginalPhoto); self.doneButtonClickBlock(_isSelectOriginalPhoto);
} }
......
...@@ -443,53 +443,36 @@ ...@@ -443,53 +443,36 @@
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
// save photo and get asset / 保存图片,获取到asset // save photo and get asset / 保存图片,获取到asset
[[TZImageManager manager] savePhotoWithImage:image location:self.location completion:^(NSError *error){ [[TZImageManager manager] savePhotoWithImage:image location:self.location completion:^(PHAsset *asset, NSError *error){
[tzImagePickerVc hideProgressHUD];
if (error) { if (error) {
[tzImagePickerVc hideProgressHUD];
NSLog(@"图片保存失败 %@",error); NSLog(@"图片保存失败 %@",error);
} else { } else {
[[TZImageManager manager] getCameraRollAlbum:NO allowPickingImage:YES needFetchAssets:NO completion:^(TZAlbumModel *model) { TZAssetModel *assetModel = [[TZImageManager manager] createModelWithAsset:asset];
[[TZImageManager manager] getAssetsFromFetchResult:model.result allowPickingVideo:NO allowPickingImage:YES completion:^(NSArray<TZAssetModel *> *models) { if (self.allowCropSwitch.isOn) { // 允许裁剪,去裁剪
[tzImagePickerVc hideProgressHUD]; TZImagePickerController *imagePicker = [[TZImagePickerController alloc] initCropTypeWithAsset:assetModel.asset photo:image completion:^(UIImage *cropImage, id asset) {
TZAssetModel *assetModel = [models firstObject]; [self refreshCollectionViewWithAddedAsset:asset image:cropImage];
if (tzImagePickerVc.sortAscendingByModificationDate) {
assetModel = [models lastObject];
}
if (self.allowCropSwitch.isOn) { // 允许裁剪,去裁剪
TZImagePickerController *imagePicker = [[TZImagePickerController alloc] initCropTypeWithAsset:assetModel.asset photo:image completion:^(UIImage *cropImage, id asset) {
[self refreshCollectionViewWithAddedAsset:asset image:cropImage];
}];
imagePicker.needCircleCrop = self.needCircleCropSwitch.isOn;
imagePicker.circleCropRadius = 100;
[self presentViewController:imagePicker animated:YES completion:nil];
} else {
[self refreshCollectionViewWithAddedAsset:assetModel.asset image:image];
}
}]; }];
}]; imagePicker.needCircleCrop = self.needCircleCropSwitch.isOn;
imagePicker.circleCropRadius = 100;
[self presentViewController:imagePicker animated:YES completion:nil];
} else {
[self refreshCollectionViewWithAddedAsset:assetModel.asset image:image];
}
} }
}]; }];
} else if ([type isEqualToString:@"public.movie"]) { } else if ([type isEqualToString:@"public.movie"]) {
NSURL *videoUrl = [info objectForKey:UIImagePickerControllerMediaURL]; NSURL *videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];
if (videoUrl) { if (videoUrl) {
[[TZImageManager manager] saveVideoWithUrl:videoUrl location:self.location completion:^(NSError *error) { [[TZImageManager manager] saveVideoWithUrl:videoUrl location:self.location completion:^(PHAsset *asset, NSError *error) {
[tzImagePickerVc hideProgressHUD];
if (!error) { if (!error) {
[[TZImageManager manager] getCameraRollAlbum:YES allowPickingImage:NO needFetchAssets:NO completion:^(TZAlbumModel *model) { TZAssetModel *assetModel = [[TZImageManager manager] createModelWithAsset:asset];
[[TZImageManager manager] getAssetsFromFetchResult:model.result allowPickingVideo:YES allowPickingImage:NO completion:^(NSArray<TZAssetModel *> *models) { [[TZImageManager manager] getPhotoWithAsset:assetModel.asset completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) {
[tzImagePickerVc hideProgressHUD]; if (!isDegraded && photo) {
TZAssetModel *assetModel = [models firstObject]; [self refreshCollectionViewWithAddedAsset:assetModel.asset image:photo];
if (tzImagePickerVc.sortAscendingByModificationDate) { }
assetModel = [models lastObject];
}
[[TZImageManager manager] getPhotoWithAsset:assetModel.asset completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) {
if (!isDegraded && photo) {
[self refreshCollectionViewWithAddedAsset:assetModel.asset image:photo];
}
}];
}];
}]; }];
} else {
[tzImagePickerVc hideProgressHUD];
} }
}]; }];
} }
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>3.0.0</string> <string>3.0.4</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string> <string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key> <key>NSPrincipalClass</key>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment