From 9e8f7ec81f6204c2b4c2c9aeb5c9faa9e8cf62ac Mon Sep 17 00:00:00 2001 From: "yuzheng.tz" Date: Thu, 23 Aug 2018 12:26:32 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4iOS6=E5=92=8C7=E7=9A=84?= =?UTF-8?q?=E9=80=82=E9=85=8D=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TZImagePickerController.podspec | 2 +- .../project.pbxproj | 2 - .../TZImagePickerController/TZAssetCell.m | 16 +- .../TZImagePickerController/TZAssetModel.h | 14 +- .../TZImagePickerController/TZAssetModel.m | 8 +- .../TZGifPhotoPreviewController.m | 12 +- .../TZImagePickerController/TZImageManager.h | 47 +- .../TZImagePickerController/TZImageManager.m | 944 ++++++------------ .../TZImagePickerController.h | 29 +- .../TZImagePickerController.m | 124 +-- .../TZLocationManager.m | 4 +- .../TZPhotoPickerController.m | 72 +- .../TZPhotoPreviewCell.m | 4 +- .../TZPhotoPreviewController.m | 13 +- .../TZVideoPlayerController.m | 6 +- TZImagePickerController/TZTestCell.m | 16 +- TZImagePickerController/ViewController.m | 144 +-- 17 files changed, 474 insertions(+), 983 deletions(-) diff --git a/TZImagePickerController.podspec b/TZImagePickerController.podspec index 354076d2..897d0c5a 100644 --- a/TZImagePickerController.podspec +++ b/TZImagePickerController.podspec @@ -11,5 +11,5 @@ Pod::Spec.new do |s| s.requires_arc = true s.resources = "TZImagePickerController/TZImagePickerController/*.{png,bundle}" s.source_files = "TZImagePickerController/TZImagePickerController/*.{h,m}" - s.frameworks = "Photos","AssetsLibrary" + s.frameworks = "Photos" end diff --git a/TZImagePickerController.xcodeproj/project.pbxproj b/TZImagePickerController.xcodeproj/project.pbxproj index 6e2f6ec5..25bfabcb 100644 --- a/TZImagePickerController.xcodeproj/project.pbxproj +++ b/TZImagePickerController.xcodeproj/project.pbxproj @@ -32,7 +32,6 @@ 902938D81EE2D02C000F2F8F /* TZLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 902938D71EE2D02C000F2F8F /* TZLocationManager.m */; }; 9038D5911C3974F0007DE549 /* TZTestCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9038D5901C3974F0007DE549 /* TZTestCell.m */; }; 903996931F447604005E77C2 /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 903996921F447604005E77C2 /* Photos.framework */; }; - 903996951F447609005E77C2 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 903996941F447609005E77C2 /* AssetsLibrary.framework */; }; 90A74B85203287C200D84C2A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 90A74B83203287C200D84C2A /* Localizable.strings */; }; 90CE84AE1C3A89EF003D0779 /* TZImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 90CE84AD1C3A89EF003D0779 /* TZImageManager.m */; }; 90CE84B71C3BABB6003D0779 /* TZVideoPlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 90CE84B61C3BABB6003D0779 /* TZVideoPlayerController.m */; }; @@ -173,7 +172,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 903996951F447609005E77C2 /* AssetsLibrary.framework in Frameworks */, 903996931F447604005E77C2 /* Photos.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/TZImagePickerController/TZImagePickerController/TZAssetCell.m b/TZImagePickerController/TZImagePickerController/TZAssetCell.m index a19a7bb0..3b675d1b 100644 --- a/TZImagePickerController/TZImagePickerController/TZAssetCell.m +++ b/TZImagePickerController/TZImagePickerController/TZAssetCell.m @@ -30,22 +30,14 @@ @implementation TZAssetCell - (void)setModel:(TZAssetModel *)model { _model = model; - if (iOS8Later) { - self.representedAssetIdentifier = [[TZImageManager manager] getAssetIdentifier:model.asset]; - } + self.representedAssetIdentifier = model.asset.localIdentifier; if (self.useCachedImage && model.cachedImage) { self.imageView.image = model.cachedImage; } else { self.model.cachedImage = nil; int32_t imageRequestID = [[TZImageManager manager] getPhotoWithAsset:model.asset photoWidth:self.tz_width completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { // Set the cell's thumbnail image if it's still showing the same asset. - if (!iOS8Later) { - self.imageView.image = photo; - self.model.cachedImage = photo; - [self hideProgressView]; - return; - } - if ([self.representedAssetIdentifier isEqualToString:[[TZImageManager manager] getAssetIdentifier:model.asset]]) { + if ([self.representedAssetIdentifier isEqualToString:model.asset.localIdentifier]) { self.imageView.image = photo; self.model.cachedImage = photo; } else { @@ -385,7 +377,7 @@ - (void)setModel:(TZAlbumModel *)model { /// For fitting iOS6 - (void)layoutSubviews { - if (iOS7Later) [super layoutSubviews]; + [super layoutSubviews]; _selectedCountButton.frame = CGRectMake(self.tz_width - 24 - 30, 23, 24, 24); NSInteger titleHeight = ceil(self.titleLabel.font.lineHeight); self.titleLabel.frame = CGRectMake(80, (self.tz_height - titleHeight) / 2, self.tz_width - 80 - 50, titleHeight); @@ -397,7 +389,7 @@ - (void)layoutSubviews { } - (void)layoutSublayersOfLayer:(CALayer *)layer { - if (iOS7Later) [super layoutSublayersOfLayer:layer]; + [super layoutSublayersOfLayer:layer]; } #pragma mark - Lazy load diff --git a/TZImagePickerController/TZImagePickerController/TZAssetModel.h b/TZImagePickerController/TZImagePickerController/TZAssetModel.h index 402ce2d2..2f563127 100755 --- a/TZImagePickerController/TZImagePickerController/TZAssetModel.h +++ b/TZImagePickerController/TZImagePickerController/TZAssetModel.h @@ -20,17 +20,17 @@ typedef enum : NSUInteger { @class PHAsset; @interface TZAssetModel : NSObject -@property (nonatomic, strong) id asset; ///< PHAsset or ALAsset +@property (nonatomic, strong) PHAsset *asset; @property (nonatomic, assign) BOOL isSelected; ///< The select status of a photo, default is No @property (nonatomic, assign) TZAssetModelMediaType type; @property (assign, nonatomic) BOOL needOscillatoryAnimation; @property (nonatomic, copy) NSString *timeLength; @property (strong, nonatomic) UIImage *cachedImage; -/// Init a photo dataModel With a asset -/// 用一个PHAsset/ALAsset实例,初始化一个照片模型 -+ (instancetype)modelWithAsset:(id)asset type:(TZAssetModelMediaType)type; -+ (instancetype)modelWithAsset:(id)asset type:(TZAssetModelMediaType)type timeLength:(NSString *)timeLength; +/// Init a photo dataModel With a PHAsset +/// 用一个PHAsset实例,初始化一个照片模型 ++ (instancetype)modelWithAsset:(PHAsset *)asset type:(TZAssetModelMediaType)type; ++ (instancetype)modelWithAsset:(PHAsset *)asset type:(TZAssetModelMediaType)type timeLength:(NSString *)timeLength; @end @@ -40,7 +40,7 @@ typedef enum : NSUInteger { @property (nonatomic, strong) NSString *name; ///< The album name @property (nonatomic, assign) NSInteger count; ///< Count of photos the album contain -@property (nonatomic, strong) id result; ///< PHFetchResult or ALAssetsGroup +@property (nonatomic, strong) PHFetchResult *result; @property (nonatomic, strong) NSArray *models; @property (nonatomic, strong) NSArray *selectedModels; @@ -48,6 +48,6 @@ typedef enum : NSUInteger { @property (nonatomic, assign) BOOL isCameraRoll; -- (void)setResult:(id)result needFetchAssets:(BOOL)needFetchAssets; +- (void)setResult:(PHFetchResult *)result needFetchAssets:(BOOL)needFetchAssets; @end diff --git a/TZImagePickerController/TZImagePickerController/TZAssetModel.m b/TZImagePickerController/TZImagePickerController/TZAssetModel.m index d0018a8c..0cd19d45 100644 --- a/TZImagePickerController/TZImagePickerController/TZAssetModel.m +++ b/TZImagePickerController/TZImagePickerController/TZAssetModel.m @@ -11,7 +11,7 @@ @implementation TZAssetModel -+ (instancetype)modelWithAsset:(id)asset type:(TZAssetModelMediaType)type{ ++ (instancetype)modelWithAsset:(PHAsset *)asset type:(TZAssetModelMediaType)type{ TZAssetModel *model = [[TZAssetModel alloc] init]; model.asset = asset; model.isSelected = NO; @@ -19,7 +19,7 @@ + (instancetype)modelWithAsset:(id)asset type:(TZAssetModelMediaType)type{ return model; } -+ (instancetype)modelWithAsset:(id)asset type:(TZAssetModelMediaType)type timeLength:(NSString *)timeLength { ++ (instancetype)modelWithAsset:(PHAsset *)asset type:(TZAssetModelMediaType)type timeLength:(NSString *)timeLength { TZAssetModel *model = [self modelWithAsset:asset type:type]; model.timeLength = timeLength; return model; @@ -31,7 +31,7 @@ + (instancetype)modelWithAsset:(id)asset type:(TZAssetModelMediaType)type timeLe @implementation TZAlbumModel -- (void)setResult:(id)result needFetchAssets:(BOOL)needFetchAssets { +- (void)setResult:(PHFetchResult *)result needFetchAssets:(BOOL)needFetchAssets { _result = result; if (needFetchAssets) { [[TZImageManager manager] getAssetsFromFetchResult:result completion:^(NSArray *models) { @@ -57,7 +57,7 @@ - (void)checkSelectedModels { [selectedAssets addObject:model.asset]; } for (TZAssetModel *model in _models) { - if ([[TZImageManager manager] isAssetsArray:selectedAssets containAsset:model.asset]) { + if ([selectedAssets containsObject:model.asset]) { self.selectedCount ++; } } diff --git a/TZImagePickerController/TZImagePickerController/TZGifPhotoPreviewController.m b/TZImagePickerController/TZImagePickerController/TZGifPhotoPreviewController.m index 6a911dad..c832f197 100644 --- a/TZImagePickerController/TZImagePickerController/TZGifPhotoPreviewController.m +++ b/TZImagePickerController/TZImagePickerController/TZGifPhotoPreviewController.m @@ -43,7 +43,7 @@ - (void)viewDidLoad { - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; _originStatusBarStyle = [UIApplication sharedApplication].statusBarStyle; - [UIApplication sharedApplication].statusBarStyle = iOS7Later ? UIStatusBarStyleLightContent : UIStatusBarStyleBlackOpaque; + [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; } - (void)viewWillDisappear:(BOOL)animated { @@ -119,12 +119,10 @@ - (void)signleTapAction { _toolBar.hidden = !_toolBar.isHidden; [self.navigationController setNavigationBarHidden:_toolBar.isHidden]; TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController; - if (iOS7Later) { - if (_toolBar.isHidden) { - [UIApplication sharedApplication].statusBarHidden = YES; - } else if (tzImagePickerVc.needShowStatusBar) { - [UIApplication sharedApplication].statusBarHidden = NO; - } + if (_toolBar.isHidden) { + [UIApplication sharedApplication].statusBarHidden = YES; + } else if (tzImagePickerVc.needShowStatusBar) { + [UIApplication sharedApplication].statusBarHidden = NO; } } diff --git a/TZImagePickerController/TZImagePickerController/TZImageManager.h b/TZImagePickerController/TZImagePickerController/TZImageManager.h index 9d7dd809..4cfbb3af 100755 --- a/TZImagePickerController/TZImagePickerController/TZImageManager.h +++ b/TZImagePickerController/TZImagePickerController/TZImageManager.h @@ -54,26 +54,26 @@ - (void)getAllAlbums:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage needFetchAssets:(BOOL)needFetchAssets completion:(void (^)(NSArray *models))completion; /// Get Assets 获得Asset数组 -- (void)getAssetsFromFetchResult:(id)result completion:(void (^)(NSArray *models))completion; -- (void)getAssetsFromFetchResult:(id)result allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray *models))completion; -- (void)getAssetFromFetchResult:(id)result atIndex:(NSInteger)index allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAssetModel *model))completion; +- (void)getAssetsFromFetchResult:(PHFetchResult *)result completion:(void (^)(NSArray *models))completion; +- (void)getAssetsFromFetchResult:(PHFetchResult *)result allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray *models))completion; +- (void)getAssetFromFetchResult:(PHFetchResult *)result atIndex:(NSInteger)index allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAssetModel *model))completion; /// Get photo 获得照片 - (void)getPostImageWithAlbumModel:(TZAlbumModel *)model completion:(void (^)(UIImage *postImage))completion; -- (int32_t)getPhotoWithAsset:(id)asset completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion; -- (int32_t)getPhotoWithAsset:(id)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion; -- (int32_t)getPhotoWithAsset:(id)asset completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler networkAccessAllowed:(BOOL)networkAccessAllowed; -- (int32_t)getPhotoWithAsset:(id)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler networkAccessAllowed:(BOOL)networkAccessAllowed; -- (int32_t)requestImageDataForAsset:(id)asset completion:(void (^)(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler; +- (int32_t)getPhotoWithAsset:(PHAsset *)asset completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion; +- (int32_t)getPhotoWithAsset:(PHAsset *)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion; +- (int32_t)getPhotoWithAsset:(PHAsset *)asset completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler networkAccessAllowed:(BOOL)networkAccessAllowed; +- (int32_t)getPhotoWithAsset:(PHAsset *)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler networkAccessAllowed:(BOOL)networkAccessAllowed; +- (int32_t)requestImageDataForAsset:(PHAsset *)asset completion:(void (^)(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler; /// Get full Image 获取原图 /// 如下两个方法completion一般会调多次,一般会先返回缩略图,再返回原图(详见方法内部使用的系统API的说明),如果info[PHImageResultIsDegradedKey] 为 YES,则表明当前返回的是缩略图,否则是原图。 -- (void)getOriginalPhotoWithAsset:(id)asset completion:(void (^)(UIImage *photo,NSDictionary *info))completion; -- (void)getOriginalPhotoWithAsset:(id)asset newCompletion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion; +- (void)getOriginalPhotoWithAsset:(PHAsset *)asset completion:(void (^)(UIImage *photo,NSDictionary *info))completion; +- (void)getOriginalPhotoWithAsset:(PHAsset *)asset newCompletion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion; // 该方法中,completion只会走一次 -- (void)getOriginalPhotoDataWithAsset:(id)asset completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion; -- (void)getOriginalPhotoDataWithAsset:(id)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 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 保存照片 - (void)savePhotoWithImage:(UIImage *)image completion:(void (^)(NSError *error))completion; @@ -84,38 +84,33 @@ - (void)saveVideoWithUrl:(NSURL *)url location:(CLLocation *)location completion:(void (^)(NSError *error))completion; /// Get video 获得视频 -- (void)getVideoWithAsset:(id)asset completion:(void (^)(AVPlayerItem * playerItem, NSDictionary * info))completion; -- (void)getVideoWithAsset:(id)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler completion:(void (^)(AVPlayerItem *, NSDictionary *))completion; +- (void)getVideoWithAsset:(PHAsset *)asset completion:(void (^)(AVPlayerItem * playerItem, NSDictionary * info))completion; +- (void)getVideoWithAsset:(PHAsset *)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler completion:(void (^)(AVPlayerItem *, NSDictionary *))completion; /// Export video 导出视频 presetName: 预设名字,默认值是AVAssetExportPreset640x480 -- (void)getVideoOutputPathWithAsset:(id)asset success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure; -- (void)getVideoOutputPathWithAsset:(id)asset presetName:(NSString *)presetName success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure; +- (void)getVideoOutputPathWithAsset:(PHAsset *)asset success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure; +- (void)getVideoOutputPathWithAsset:(PHAsset *)asset presetName:(NSString *)presetName success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure; /// Deprecated, Use -getVideoOutputPathWithAsset:failure:success: -- (void)getVideoOutputPathWithAsset:(id)asset completion:(void (^)(NSString *outputPath))completion __attribute__((deprecated("Use -getVideoOutputPathWithAsset:failure:success:"))); +- (void)getVideoOutputPathWithAsset:(PHAsset *)asset completion:(void (^)(NSString *outputPath))completion __attribute__((deprecated("Use -getVideoOutputPathWithAsset:failure:success:"))); /// Get photo bytes 获得一组照片的大小 - (void)getPhotosBytesWithArray:(NSArray *)photos completion:(void (^)(NSString *totalBytes))completion; -/// Judge is a assets array contain the asset 判断一个assets数组是否包含这个asset -- (BOOL)isAssetsArray:(NSArray *)assets containAsset:(id)asset; - -- (NSString *)getAssetIdentifier:(id)asset; -- (BOOL)isCameraRollAlbum:(id)metadata; +- (BOOL)isCameraRollAlbum:(PHAssetCollection *)metadata; /// 检查照片大小是否满足最小要求 -- (BOOL)isPhotoSelectableWithAsset:(id)asset; -- (CGSize)photoSizeWithAsset:(id)asset; +- (BOOL)isPhotoSelectableWithAsset:(PHAsset *)asset; /// 修正图片转向 - (UIImage *)fixOrientation:(UIImage *)aImage; /// 获取asset的资源类型 -- (TZAssetModelMediaType)getAssetType:(id)asset; +- (TZAssetModelMediaType)getAssetType:(PHAsset *)asset; /// 缩放图片至新尺寸 - (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size; /// 判断asset是否是视频 -- (BOOL)isVideo:(id)asset; +- (BOOL)isVideo:(PHAsset *)asset; @end diff --git a/TZImagePickerController/TZImagePickerController/TZImageManager.m b/TZImagePickerController/TZImagePickerController/TZImageManager.m index 26dcfde8..ab6b793d 100755 --- a/TZImagePickerController/TZImagePickerController/TZImageManager.m +++ b/TZImagePickerController/TZImagePickerController/TZImageManager.m @@ -7,14 +7,12 @@ // #import "TZImageManager.h" -#import #import "TZAssetModel.h" #import "TZImagePickerController.h" @interface TZImageManager () #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, strong) ALAssetsLibrary *assetLibrary; @end @implementation TZImageManager @@ -29,10 +27,8 @@ @implementation TZImageManager + (instancetype)manager { dispatch_once(&onceToken, ^{ manager = [[self alloc] init]; - if (iOS8Later) { - // manager.cachingImageManager = [[PHCachingImageManager alloc] init]; - // manager.cachingImageManager.allowsCachingHighQualityImages = YES; - } + // manager.cachingImageManager = [[PHCachingImageManager alloc] init]; + // manager.cachingImageManager.allowsCachingHighQualityImages = YES; [manager configTZScreenWidth]; }); @@ -67,11 +63,6 @@ - (void)configTZScreenWidth { } } -- (ALAssetsLibrary *)assetLibrary { - if (_assetLibrary == nil) _assetLibrary = [[ALAssetsLibrary alloc] init]; - return _assetLibrary; -} - /// Return YES if Authorized 返回YES如果得到了授权 - (BOOL)authorizationStatusAuthorized { NSInteger status = [self.class authorizationStatus]; @@ -86,12 +77,7 @@ - (BOOL)authorizationStatusAuthorized { } + (NSInteger)authorizationStatus { - if (iOS8Later) { - return [PHPhotoLibrary authorizationStatus]; - } else { - return [ALAssetsLibrary authorizationStatus]; - } - return NO; + return [PHPhotoLibrary authorizationStatus]; } - (void)requestAuthorizationWithCompletion:(void (^)(void))completion { @@ -103,19 +89,11 @@ - (void)requestAuthorizationWithCompletion:(void (^)(void))completion { }); }; - if (iOS8Later) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { - callCompletionBlock(); - }]; - }); - } else { - [self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { - callCompletionBlock(); - } failureBlock:^(NSError *error) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { callCompletionBlock(); }]; - } + }); } #pragma mark - Get Album @@ -123,201 +101,108 @@ - (void)requestAuthorizationWithCompletion:(void (^)(void))completion { /// Get Album 获得相册/相册数组 - (void)getCameraRollAlbum:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage needFetchAssets:(BOOL)needFetchAssets completion:(void (^)(TZAlbumModel *model))completion { __block TZAlbumModel *model; - if (iOS8Later) { - PHFetchOptions *option = [[PHFetchOptions alloc] init]; - if (!allowPickingVideo) option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; - if (!allowPickingImage) option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", - PHAssetMediaTypeVideo]; - // option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"modificationDate" ascending:self.sortAscendingByModificationDate]]; - if (!self.sortAscendingByModificationDate) { - option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:self.sortAscendingByModificationDate]]; - } - PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; - for (PHAssetCollection *collection in smartAlbums) { - // 有可能是PHCollectionList类的的对象,过滤掉 - if (![collection isKindOfClass:[PHAssetCollection class]]) continue; - // 过滤空相册 - if (collection.estimatedAssetCount <= 0) continue; - if ([self isCameraRollAlbum:collection]) { - PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:option]; - model = [self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:YES needFetchAssets:needFetchAssets]; - if (completion) completion(model); - break; - } + PHFetchOptions *option = [[PHFetchOptions alloc] init]; + if (!allowPickingVideo) option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; + if (!allowPickingImage) option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", + PHAssetMediaTypeVideo]; + // option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"modificationDate" ascending:self.sortAscendingByModificationDate]]; + if (!self.sortAscendingByModificationDate) { + option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:self.sortAscendingByModificationDate]]; + } + PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; + for (PHAssetCollection *collection in smartAlbums) { + // 有可能是PHCollectionList类的的对象,过滤掉 + if (![collection isKindOfClass:[PHAssetCollection class]]) continue; + // 过滤空相册 + if (collection.estimatedAssetCount <= 0) continue; + if ([self isCameraRollAlbum:collection]) { + PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:option]; + model = [self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:YES needFetchAssets:needFetchAssets]; + if (completion) completion(model); + break; } - } else { - [self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { - if ([group numberOfAssets] < 1) return; - if ([self isCameraRollAlbum:group]) { - NSString *name = [group valueForProperty:ALAssetsGroupPropertyName]; - model = [self modelWithResult:group name:name isCameraRoll:YES needFetchAssets:needFetchAssets]; - if (completion) completion(model); - *stop = YES; - } - } failureBlock:nil]; } } - (void)getAllAlbums:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage needFetchAssets:(BOOL)needFetchAssets completion:(void (^)(NSArray *))completion{ NSMutableArray *albumArr = [NSMutableArray array]; - if (iOS8Later) { - PHFetchOptions *option = [[PHFetchOptions alloc] init]; - if (!allowPickingVideo) option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; - if (!allowPickingImage) option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", - PHAssetMediaTypeVideo]; - // option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"modificationDate" ascending:self.sortAscendingByModificationDate]]; - if (!self.sortAscendingByModificationDate) { - option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:self.sortAscendingByModificationDate]]; - } - // 我的照片流 1.6.10重新加入.. - PHFetchResult *myPhotoStreamAlbum = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumMyPhotoStream options:nil]; - PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; - PHFetchResult *topLevelUserCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil]; - PHFetchResult *syncedAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumSyncedAlbum options:nil]; - PHFetchResult *sharedAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumCloudShared options:nil]; - NSArray *allAlbums = @[myPhotoStreamAlbum,smartAlbums,topLevelUserCollections,syncedAlbums,sharedAlbums]; - for (PHFetchResult *fetchResult in allAlbums) { - for (PHAssetCollection *collection in fetchResult) { - // 有可能是PHCollectionList类的的对象,过滤掉 - if (![collection isKindOfClass:[PHAssetCollection class]]) continue; - // 过滤空相册 - if (collection.estimatedAssetCount <= 0) continue; - PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:option]; - if (fetchResult.count < 1) continue; - - if ([self.pickerDelegate respondsToSelector:@selector(isAlbumCanSelect:result:)]) { - if (![self.pickerDelegate isAlbumCanSelect:collection.localizedTitle result:fetchResult]) { - continue; - } - } - - if (collection.assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumAllHidden) continue; - if (collection.assetCollectionSubtype == 1000000201) continue; //『最近删除』相册 - if ([self isCameraRollAlbum:collection]) { - [albumArr insertObject:[self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:YES needFetchAssets:needFetchAssets] atIndex:0]; - } else { - [albumArr addObject:[self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:NO needFetchAssets:needFetchAssets]]; - } - } - } - if (completion && albumArr.count > 0) completion(albumArr); - } else { - [self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { - if (group == nil) { - if (completion && albumArr.count > 0) completion(albumArr); - } - if ([group numberOfAssets] < 1) return; - NSString *name = [group valueForProperty:ALAssetsGroupPropertyName]; + PHFetchOptions *option = [[PHFetchOptions alloc] init]; + if (!allowPickingVideo) option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; + if (!allowPickingImage) option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", + PHAssetMediaTypeVideo]; + // option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"modificationDate" ascending:self.sortAscendingByModificationDate]]; + if (!self.sortAscendingByModificationDate) { + option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:self.sortAscendingByModificationDate]]; + } + // 我的照片流 1.6.10重新加入.. + PHFetchResult *myPhotoStreamAlbum = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumMyPhotoStream options:nil]; + PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; + PHFetchResult *topLevelUserCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil]; + PHFetchResult *syncedAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumSyncedAlbum options:nil]; + PHFetchResult *sharedAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumCloudShared options:nil]; + NSArray *allAlbums = @[myPhotoStreamAlbum,smartAlbums,topLevelUserCollections,syncedAlbums,sharedAlbums]; + for (PHFetchResult *fetchResult in allAlbums) { + for (PHAssetCollection *collection in fetchResult) { + // 有可能是PHCollectionList类的的对象,过滤掉 + if (![collection isKindOfClass:[PHAssetCollection class]]) continue; + // 过滤空相册 + if (collection.estimatedAssetCount <= 0) continue; + PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:option]; + if (fetchResult.count < 1) continue; if ([self.pickerDelegate respondsToSelector:@selector(isAlbumCanSelect:result:)]) { - if (![self.pickerDelegate isAlbumCanSelect:name result:group]) { - return; + if (![self.pickerDelegate isAlbumCanSelect:collection.localizedTitle result:fetchResult]) { + continue; } } - if ([self isCameraRollAlbum:group]) { - [albumArr insertObject:[self modelWithResult:group name:name isCameraRoll:YES needFetchAssets:needFetchAssets] atIndex:0]; - } else if ([[group valueForProperty:ALAssetsGroupPropertyType] intValue] == ALAssetsGroupPhotoStream) { - if (albumArr.count) { - [albumArr insertObject:[self modelWithResult:group name:name isCameraRoll:NO needFetchAssets:needFetchAssets] atIndex:1]; - } else { - [albumArr addObject:[self modelWithResult:group name:name isCameraRoll:NO needFetchAssets:needFetchAssets]]; - } + if (collection.assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumAllHidden) continue; + if (collection.assetCollectionSubtype == 1000000201) continue; //『最近删除』相册 + if ([self isCameraRollAlbum:collection]) { + [albumArr insertObject:[self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:YES needFetchAssets:needFetchAssets] atIndex:0]; } else { - [albumArr addObject:[self modelWithResult:group name:name isCameraRoll:NO needFetchAssets:needFetchAssets]]; + [albumArr addObject:[self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:NO needFetchAssets:needFetchAssets]]; } - } failureBlock:nil]; + } } + if (completion && albumArr.count > 0) completion(albumArr); } #pragma mark - Get Assets /// Get Assets 获得照片数组 -- (void)getAssetsFromFetchResult:(id)result completion:(void (^)(NSArray *))completion { +- (void)getAssetsFromFetchResult:(PHFetchResult *)result completion:(void (^)(NSArray *))completion { TZImagePickerConfig *config = [TZImagePickerConfig sharedInstance]; return [self getAssetsFromFetchResult:result allowPickingVideo:config.allowPickingVideo allowPickingImage:config.allowPickingImage completion:completion]; } -- (void)getAssetsFromFetchResult:(id)result allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray *))completion { +- (void)getAssetsFromFetchResult:(PHFetchResult *)result allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray *))completion { NSMutableArray *photoArr = [NSMutableArray array]; - if ([result isKindOfClass:[PHFetchResult class]]) { - PHFetchResult *fetchResult = (PHFetchResult *)result; - [fetchResult enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - TZAssetModel *model = [self assetModelWithAsset:obj allowPickingVideo:allowPickingVideo allowPickingImage:allowPickingImage]; - if (model) { - [photoArr addObject:model]; - } - }]; - if (completion) completion(photoArr); - } else if ([result isKindOfClass:[ALAssetsGroup class]]) { - ALAssetsGroup *group = (ALAssetsGroup *)result; - if (allowPickingImage && allowPickingVideo) { - [group setAssetsFilter:[ALAssetsFilter allAssets]]; - } else if (allowPickingVideo) { - [group setAssetsFilter:[ALAssetsFilter allVideos]]; - } else if (allowPickingImage) { - [group setAssetsFilter:[ALAssetsFilter allPhotos]]; - } - ALAssetsGroupEnumerationResultsBlock resultBlock = ^(ALAsset *result, NSUInteger index, BOOL *stop) { - if (result == nil) { - if (completion) completion(photoArr); - } - TZAssetModel *model = [self assetModelWithAsset:result allowPickingVideo:allowPickingVideo allowPickingImage:allowPickingImage]; - if (model) { - [photoArr addObject:model]; - } - }; - if (self.sortAscendingByModificationDate) { - [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { - if (resultBlock) { resultBlock(result,index,stop); } - }]; - } else { - [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { - if (resultBlock) { resultBlock(result,index,stop); } - }]; + [result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL * _Nonnull stop) { + TZAssetModel *model = [self assetModelWithAsset:asset allowPickingVideo:allowPickingVideo allowPickingImage:allowPickingImage]; + if (model) { + [photoArr addObject:model]; } - } + }]; + if (completion) completion(photoArr); } /// Get asset at index 获得下标为index的单个照片 /// if index beyond bounds, return nil in callback 如果索引越界, 在回调中返回 nil -- (void)getAssetFromFetchResult:(id)result atIndex:(NSInteger)index allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAssetModel *))completion { - if ([result isKindOfClass:[PHFetchResult class]]) { - PHFetchResult *fetchResult = (PHFetchResult *)result; - PHAsset *asset; - @try { - asset = fetchResult[index]; - } - @catch (NSException* e) { - if (completion) completion(nil); - return; - } - TZAssetModel *model = [self assetModelWithAsset:asset allowPickingVideo:allowPickingVideo allowPickingImage:allowPickingImage]; - if (completion) completion(model); - } else if ([result isKindOfClass:[ALAssetsGroup class]]) { - ALAssetsGroup *group = (ALAssetsGroup *)result; - if (allowPickingImage && allowPickingVideo) { - [group setAssetsFilter:[ALAssetsFilter allAssets]]; - } else if (allowPickingVideo) { - [group setAssetsFilter:[ALAssetsFilter allVideos]]; - } else if (allowPickingImage) { - [group setAssetsFilter:[ALAssetsFilter allPhotos]]; - } - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:index]; - @try { - [group enumerateAssetsAtIndexes:indexSet options:NSEnumerationConcurrent usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { - if (!result) return; - TZAssetModel *model = [self assetModelWithAsset:result allowPickingVideo:allowPickingVideo allowPickingImage:allowPickingImage]; - if (completion) completion(model); - }]; - } - @catch (NSException* e) { - if (completion) completion(nil); - } +- (void)getAssetFromFetchResult:(PHFetchResult *)result atIndex:(NSInteger)index allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAssetModel *))completion { + PHAsset *asset; + @try { + asset = result[index]; } + @catch (NSException* e) { + if (completion) completion(nil); + return; + } + TZAssetModel *model = [self assetModelWithAsset:asset allowPickingVideo:allowPickingVideo allowPickingImage:allowPickingImage]; + if (completion) completion(model); } -- (TZAssetModel *)assetModelWithAsset:(id)asset allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage { +- (TZAssetModel *)assetModelWithAsset:(PHAsset *)asset allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage { BOOL canSelect = YES; if ([self.pickerDelegate respondsToSelector:@selector(isAssetCanSelect:)]) { canSelect = [self.pickerDelegate isAssetCanSelect:asset]; @@ -326,63 +211,35 @@ - (TZAssetModel *)assetModelWithAsset:(id)asset allowPickingVideo:(BOOL)allowPic TZAssetModel *model; TZAssetModelMediaType type = [self getAssetType:asset]; - if ([asset isKindOfClass:[PHAsset class]]) { - if (!allowPickingVideo && type == TZAssetModelMediaTypeVideo) return nil; - if (!allowPickingImage && type == TZAssetModelMediaTypePhoto) return nil; - if (!allowPickingImage && type == TZAssetModelMediaTypePhotoGif) return nil; - - PHAsset *phAsset = (PHAsset *)asset; - if (self.hideWhenCanNotSelect) { - // 过滤掉尺寸不满足要求的图片 - if (![self isPhotoSelectableWithAsset:phAsset]) { - return nil; - } - } - NSString *timeLength = type == TZAssetModelMediaTypeVideo ? [NSString stringWithFormat:@"%0.0f",phAsset.duration] : @""; - timeLength = [self getNewTimeFromDurationSecond:timeLength.integerValue]; - model = [TZAssetModel modelWithAsset:asset type:type timeLength:timeLength]; - } else { - if (!allowPickingVideo){ - model = [TZAssetModel modelWithAsset:asset type:type]; - return model; - } - /// Allow picking video - if (type == TZAssetModelMediaTypeVideo) { - NSTimeInterval duration = [[asset valueForProperty:ALAssetPropertyDuration] doubleValue]; - NSString *timeLength = [NSString stringWithFormat:@"%0.0f",duration]; - timeLength = [self getNewTimeFromDurationSecond:timeLength.integerValue]; - model = [TZAssetModel modelWithAsset:asset type:type timeLength:timeLength]; - } else { - if (self.hideWhenCanNotSelect) { - // 过滤掉尺寸不满足要求的图片 - if (![self isPhotoSelectableWithAsset:asset]) { - return nil; - } - } - model = [TZAssetModel modelWithAsset:asset type:type]; + if (!allowPickingVideo && type == TZAssetModelMediaTypeVideo) return nil; + if (!allowPickingImage && type == TZAssetModelMediaTypePhoto) return nil; + if (!allowPickingImage && type == TZAssetModelMediaTypePhotoGif) return nil; + + PHAsset *phAsset = (PHAsset *)asset; + if (self.hideWhenCanNotSelect) { + // 过滤掉尺寸不满足要求的图片 + if (![self isPhotoSelectableWithAsset:phAsset]) { + return nil; } } + NSString *timeLength = type == TZAssetModelMediaTypeVideo ? [NSString stringWithFormat:@"%0.0f",phAsset.duration] : @""; + timeLength = [self getNewTimeFromDurationSecond:timeLength.integerValue]; + model = [TZAssetModel modelWithAsset:asset type:type timeLength:timeLength]; return model; } -- (TZAssetModelMediaType)getAssetType:(id)asset { +- (TZAssetModelMediaType)getAssetType:(PHAsset *)asset { TZAssetModelMediaType type = TZAssetModelMediaTypePhoto; - if ([asset isKindOfClass:[PHAsset class]]) { - PHAsset *phAsset = (PHAsset *)asset; - if (phAsset.mediaType == PHAssetMediaTypeVideo) type = TZAssetModelMediaTypeVideo; - else if (phAsset.mediaType == PHAssetMediaTypeAudio) type = TZAssetModelMediaTypeAudio; - else if (phAsset.mediaType == PHAssetMediaTypeImage) { - if (@available(iOS 9.1, *)) { - // if (asset.mediaSubtypes == PHAssetMediaSubtypePhotoLive) type = TZAssetModelMediaTypeLivePhoto; - } - // Gif - if ([[phAsset valueForKey:@"filename"] hasSuffix:@"GIF"]) { - type = TZAssetModelMediaTypePhotoGif; - } + PHAsset *phAsset = (PHAsset *)asset; + if (phAsset.mediaType == PHAssetMediaTypeVideo) type = TZAssetModelMediaTypeVideo; + else if (phAsset.mediaType == PHAssetMediaTypeAudio) type = TZAssetModelMediaTypeAudio; + else if (phAsset.mediaType == PHAssetMediaTypeImage) { + if (@available(iOS 9.1, *)) { + // if (asset.mediaSubtypes == PHAssetMediaSubtypePhotoLive) type = TZAssetModelMediaTypeLivePhoto; } - } else { - if ([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]) { - type = TZAssetModelMediaTypeVideo; + // Gif + if ([[phAsset valueForKey:@"filename"] hasSuffix:@"GIF"]) { + type = TZAssetModelMediaTypePhotoGif; } } return type; @@ -416,29 +273,20 @@ - (void)getPhotosBytesWithArray:(NSArray *)photos completion:(void (^)(NSString __block NSInteger assetCount = 0; for (NSInteger i = 0; i < photos.count; i++) { TZAssetModel *model = photos[i]; - if ([model.asset isKindOfClass:[PHAsset class]]) { - PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; - options.resizeMode = PHImageRequestOptionsResizeModeFast; - options.networkAccessAllowed = YES; - if (model.type == TZAssetModelMediaTypePhotoGif) { - options.version = PHImageRequestOptionsVersionOriginal; - } - [[PHImageManager defaultManager] requestImageDataForAsset:model.asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { - if (model.type != TZAssetModelMediaTypeVideo) dataLength += imageData.length; - assetCount ++; - if (assetCount >= photos.count) { - NSString *bytes = [self getBytesFromDataLength:dataLength]; - if (completion) completion(bytes); - } - }]; - } else if ([model.asset isKindOfClass:[ALAsset class]]) { - ALAssetRepresentation *representation = [model.asset defaultRepresentation]; - if (model.type != TZAssetModelMediaTypeVideo) dataLength += (NSInteger)representation.size; - if (i >= photos.count - 1) { + PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; + options.resizeMode = PHImageRequestOptionsResizeModeFast; + options.networkAccessAllowed = YES; + if (model.type == TZAssetModelMediaTypePhotoGif) { + options.version = PHImageRequestOptionsVersionOriginal; + } + [[PHImageManager defaultManager] requestImageDataForAsset:model.asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { + if (model.type != TZAssetModelMediaTypeVideo) dataLength += imageData.length; + assetCount ++; + if (assetCount >= photos.count) { NSString *bytes = [self getBytesFromDataLength:dataLength]; if (completion) completion(bytes); } - } + }]; } } @@ -457,7 +305,7 @@ - (NSString *)getBytesFromDataLength:(NSInteger)dataLength { #pragma mark - Get Photo /// Get photo 获得照片本身 -- (int32_t)getPhotoWithAsset:(id)asset completion:(void (^)(UIImage *, NSDictionary *, BOOL isDegraded))completion { +- (int32_t)getPhotoWithAsset:(PHAsset *)asset completion:(void (^)(UIImage *, NSDictionary *, BOOL isDegraded))completion { CGFloat fullScreenWidth = TZScreenWidth; if (fullScreenWidth > _photoPreviewMaxWidth) { fullScreenWidth = _photoPreviewMaxWidth; @@ -465,11 +313,11 @@ - (int32_t)getPhotoWithAsset:(id)asset completion:(void (^)(UIImage *, NSDiction return [self getPhotoWithAsset:asset photoWidth:fullScreenWidth completion:completion progressHandler:nil networkAccessAllowed:YES]; } -- (int32_t)getPhotoWithAsset:(id)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion { +- (int32_t)getPhotoWithAsset:(PHAsset *)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion { return [self getPhotoWithAsset:asset photoWidth:photoWidth completion:completion progressHandler:nil networkAccessAllowed:YES]; } -- (int32_t)getPhotoWithAsset:(id)asset completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler networkAccessAllowed:(BOOL)networkAccessAllowed { +- (int32_t)getPhotoWithAsset:(PHAsset *)asset completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler networkAccessAllowed:(BOOL)networkAccessAllowed { CGFloat fullScreenWidth = TZScreenWidth; if (fullScreenWidth > _photoPreviewMaxWidth) { fullScreenWidth = _photoPreviewMaxWidth; @@ -477,141 +325,98 @@ - (int32_t)getPhotoWithAsset:(id)asset completion:(void (^)(UIImage *photo,NSDic return [self getPhotoWithAsset:asset photoWidth:fullScreenWidth completion:completion progressHandler:progressHandler networkAccessAllowed:networkAccessAllowed]; } -- (int32_t)requestImageDataForAsset:(id)asset completion:(void (^)(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler { - if ([asset isKindOfClass:[PHAsset class]]) { - PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; - options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (progressHandler) { - progressHandler(progress, error, stop, info); - } - }); - }; - options.networkAccessAllowed = YES; - options.resizeMode = PHImageRequestOptionsResizeModeFast; - int32_t imageRequestID = [[PHImageManager defaultManager] requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { - if (completion) completion(imageData,dataUTI,orientation,info); - }]; - return imageRequestID; - } else if ([asset isKindOfClass:[ALAsset class]]) { - ALAsset *alAsset = (ALAsset *)asset; - dispatch_async(dispatch_get_global_queue(0,0), ^{ - ALAssetRepresentation *assetRep = [alAsset defaultRepresentation]; - CGImageRef fullScrennImageRef = [assetRep fullScreenImage]; - UIImage *fullScrennImage = [UIImage imageWithCGImage:fullScrennImageRef scale:2.0 orientation:UIImageOrientationUp]; - dispatch_async(dispatch_get_main_queue(), ^{ - if (completion) completion(UIImageJPEGRepresentation(fullScrennImage, 0.83), nil, UIImageOrientationUp, nil); - }); +- (int32_t)requestImageDataForAsset:(PHAsset *)asset completion:(void (^)(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler { + PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; + options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (progressHandler) { + progressHandler(progress, error, stop, info); + } }); - } - return 0; + }; + options.networkAccessAllowed = YES; + options.resizeMode = PHImageRequestOptionsResizeModeFast; + int32_t imageRequestID = [[PHImageManager defaultManager] requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { + if (completion) completion(imageData,dataUTI,orientation,info); + }]; + return imageRequestID; } -- (int32_t)getPhotoWithAsset:(id)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler networkAccessAllowed:(BOOL)networkAccessAllowed { - if ([asset isKindOfClass:[PHAsset class]]) { - CGSize imageSize; - if (photoWidth < TZScreenWidth && photoWidth < _photoPreviewMaxWidth) { - imageSize = AssetGridThumbnailSize; - } else { - PHAsset *phAsset = (PHAsset *)asset; - CGFloat aspectRatio = phAsset.pixelWidth / (CGFloat)phAsset.pixelHeight; - CGFloat pixelWidth = photoWidth * TZScreenScale * 1.5; - // 超宽图片 - if (aspectRatio > 1.8) { - pixelWidth = pixelWidth * aspectRatio; - } - // 超高图片 - if (aspectRatio < 0.2) { - pixelWidth = pixelWidth * 0.5; - } - CGFloat pixelHeight = pixelWidth / aspectRatio; - imageSize = CGSizeMake(pixelWidth, pixelHeight); +- (int32_t)getPhotoWithAsset:(PHAsset *)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler networkAccessAllowed:(BOOL)networkAccessAllowed { + CGSize imageSize; + if (photoWidth < TZScreenWidth && photoWidth < _photoPreviewMaxWidth) { + imageSize = AssetGridThumbnailSize; + } else { + PHAsset *phAsset = (PHAsset *)asset; + CGFloat aspectRatio = phAsset.pixelWidth / (CGFloat)phAsset.pixelHeight; + CGFloat pixelWidth = photoWidth * TZScreenScale * 1.5; + // 超宽图片 + if (aspectRatio > 1.8) { + pixelWidth = pixelWidth * aspectRatio; } - - __block UIImage *image; - // 修复获取图片时出现的瞬间内存过高问题 - // 下面两行代码,来自hsjcom,他的github是:https://github.com/hsjcom 表示感谢 - PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init]; - option.resizeMode = PHImageRequestOptionsResizeModeFast; - int32_t imageRequestID = [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage *result, NSDictionary *info) { - if (result) { - image = result; - } - BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]); - if (downloadFinined && result) { - result = [self fixOrientation:result]; - if (completion) completion(result,info,[[info objectForKey:PHImageResultIsDegradedKey] boolValue]); - } - // Download image from iCloud / 从iCloud下载图片 - if ([info objectForKey:PHImageResultIsInCloudKey] && !result && networkAccessAllowed) { - PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; - options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (progressHandler) { - progressHandler(progress, error, stop, info); - } - }); - }; - options.networkAccessAllowed = YES; - options.resizeMode = PHImageRequestOptionsResizeModeFast; - [[PHImageManager defaultManager] requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { - UIImage *resultImage = [UIImage imageWithData:imageData scale:0.1]; - if (![TZImagePickerConfig sharedInstance].notScaleImage) { - resultImage = [self scaleImage:resultImage toSize:imageSize]; - } - if (!resultImage) { - resultImage = image; + // 超高图片 + if (aspectRatio < 0.2) { + pixelWidth = pixelWidth * 0.5; + } + CGFloat pixelHeight = pixelWidth / aspectRatio; + imageSize = CGSizeMake(pixelWidth, pixelHeight); + } + + __block UIImage *image; + // 修复获取图片时出现的瞬间内存过高问题 + // 下面两行代码,来自hsjcom,他的github是:https://github.com/hsjcom 表示感谢 + PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init]; + option.resizeMode = PHImageRequestOptionsResizeModeFast; + int32_t imageRequestID = [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage *result, NSDictionary *info) { + if (result) { + image = result; + } + BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]); + if (downloadFinined && result) { + result = [self fixOrientation:result]; + if (completion) completion(result,info,[[info objectForKey:PHImageResultIsDegradedKey] boolValue]); + } + // Download image from iCloud / 从iCloud下载图片 + if ([info objectForKey:PHImageResultIsInCloudKey] && !result && networkAccessAllowed) { + PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; + options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (progressHandler) { + progressHandler(progress, error, stop, info); } - resultImage = [self fixOrientation:resultImage]; - if (completion) completion(resultImage,info,NO); - }]; - } - }]; - return imageRequestID; - } else if ([asset isKindOfClass:[ALAsset class]]) { - ALAsset *alAsset = (ALAsset *)asset; - dispatch_async(dispatch_get_global_queue(0,0), ^{ - CGImageRef thumbnailImageRef = alAsset.thumbnail; - UIImage *thumbnailImage = [UIImage imageWithCGImage:thumbnailImageRef scale:2.0 orientation:UIImageOrientationUp]; - dispatch_async(dispatch_get_main_queue(), ^{ - if (completion) completion(thumbnailImage,nil,YES); - - if (photoWidth == TZScreenWidth || photoWidth == self->_photoPreviewMaxWidth) { - dispatch_async(dispatch_get_global_queue(0,0), ^{ - ALAssetRepresentation *assetRep = [alAsset defaultRepresentation]; - CGImageRef fullScrennImageRef = [assetRep fullScreenImage]; - UIImage *fullScrennImage = [UIImage imageWithCGImage:fullScrennImageRef scale:2.0 orientation:UIImageOrientationUp]; - - dispatch_async(dispatch_get_main_queue(), ^{ - if (completion) completion(fullScrennImage,nil,NO); - }); - }); + }); + }; + options.networkAccessAllowed = YES; + options.resizeMode = PHImageRequestOptionsResizeModeFast; + [[PHImageManager defaultManager] requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { + UIImage *resultImage = [UIImage imageWithData:imageData scale:0.1]; + if (![TZImagePickerConfig sharedInstance].notScaleImage) { + resultImage = [self scaleImage:resultImage toSize:imageSize]; } - }); - }); - } - return 0; + if (!resultImage) { + resultImage = image; + } + resultImage = [self fixOrientation:resultImage]; + if (completion) completion(resultImage,info,NO); + }]; + } + }]; + return imageRequestID; } /// Get postImage / 获取封面图 - (void)getPostImageWithAlbumModel:(TZAlbumModel *)model completion:(void (^)(UIImage *))completion { - if (iOS8Later) { - id asset = [model.result lastObject]; - if (!self.sortAscendingByModificationDate) { - asset = [model.result firstObject]; - } - [[TZImageManager manager] getPhotoWithAsset:asset photoWidth:80 completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { - if (completion) completion(photo); - }]; - } else { - ALAssetsGroup *group = model.result; - UIImage *postImage = [UIImage imageWithCGImage:group.posterImage]; - if (completion) completion(postImage); + id asset = [model.result lastObject]; + if (!self.sortAscendingByModificationDate) { + asset = [model.result firstObject]; } + [[TZImageManager manager] getPhotoWithAsset:asset photoWidth:80 completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { + if (completion) completion(photo); + }]; } /// Get Original Photo / 获取原图 -- (void)getOriginalPhotoWithAsset:(id)asset completion:(void (^)(UIImage *photo,NSDictionary *info))completion { +- (void)getOriginalPhotoWithAsset:(PHAsset *)asset completion:(void (^)(UIImage *photo,NSDictionary *info))completion { [self getOriginalPhotoWithAsset:asset newCompletion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { if (completion) { completion(photo,info); @@ -619,62 +424,39 @@ - (void)getOriginalPhotoWithAsset:(id)asset completion:(void (^)(UIImage *photo, }]; } -- (void)getOriginalPhotoWithAsset:(id)asset newCompletion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion { - if ([asset isKindOfClass:[PHAsset class]]) { - PHImageRequestOptions *option = [[PHImageRequestOptions alloc]init]; - option.networkAccessAllowed = YES; - option.resizeMode = PHImageRequestOptionsResizeModeFast; - [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage *result, NSDictionary *info) { - BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]); - if (downloadFinined && result) { - result = [self fixOrientation:result]; - BOOL isDegraded = [[info objectForKey:PHImageResultIsDegradedKey] boolValue]; - if (completion) completion(result,info,isDegraded); - } - }]; - } else if ([asset isKindOfClass:[ALAsset class]]) { - ALAsset *alAsset = (ALAsset *)asset; - ALAssetRepresentation *assetRep = [alAsset defaultRepresentation]; - - dispatch_async(dispatch_get_global_queue(0,0), ^{ - CGImageRef originalImageRef = [assetRep fullResolutionImage]; - UIImage *originalImage = [UIImage imageWithCGImage:originalImageRef scale:1.0 orientation:UIImageOrientationUp]; - - dispatch_async(dispatch_get_main_queue(), ^{ - if (completion) completion(originalImage,nil,NO); - }); - }); - } +- (void)getOriginalPhotoWithAsset:(PHAsset *)asset newCompletion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion { + PHImageRequestOptions *option = [[PHImageRequestOptions alloc]init]; + option.networkAccessAllowed = YES; + option.resizeMode = PHImageRequestOptionsResizeModeFast; + [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage *result, NSDictionary *info) { + BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]); + if (downloadFinined && result) { + result = [self fixOrientation:result]; + BOOL isDegraded = [[info objectForKey:PHImageResultIsDegradedKey] boolValue]; + if (completion) completion(result,info,isDegraded); + } + }]; } -- (void)getOriginalPhotoDataWithAsset:(id)asset completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion { +- (void)getOriginalPhotoDataWithAsset:(PHAsset *)asset completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion { [self getOriginalPhotoDataWithAsset:asset progressHandler:nil completion:completion]; } -- (void)getOriginalPhotoDataWithAsset:(id)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion { - if ([asset isKindOfClass:[PHAsset class]]) { - PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init]; - option.networkAccessAllowed = YES; - if ([[asset valueForKey:@"filename"] hasSuffix:@"GIF"]) { - // if version isn't PHImageRequestOptionsVersionOriginal, the gif may cann't play - option.version = PHImageRequestOptionsVersionOriginal; - } - [option setProgressHandler:progressHandler]; - option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; - [[PHImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { - BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]); - if (downloadFinined && imageData) { - if (completion) completion(imageData,info,NO); - } - }]; - } else if ([asset isKindOfClass:[ALAsset class]]) { - ALAsset *alAsset = (ALAsset *)asset; - ALAssetRepresentation *assetRep = [alAsset defaultRepresentation]; - Byte *imageBuffer = (Byte *)malloc(assetRep.size); - NSUInteger bufferSize = [assetRep getBytes:imageBuffer fromOffset:0.0 length:assetRep.size error:nil]; - NSData *imageData = [NSData dataWithBytesNoCopy:imageBuffer length:bufferSize freeWhenDone:YES]; - if (completion) completion(imageData,nil,NO); +- (void)getOriginalPhotoDataWithAsset:(PHAsset *)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion { + PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init]; + option.networkAccessAllowed = YES; + if ([[asset valueForKey:@"filename"] hasSuffix:@"GIF"]) { + // if version isn't PHImageRequestOptionsVersionOriginal, the gif may cann't play + option.version = PHImageRequestOptionsVersionOriginal; } + [option setProgressHandler:progressHandler]; + option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; + [[PHImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { + BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]); + if (downloadFinined && imageData) { + if (completion) completion(imageData,info,NO); + } + }]; } #pragma mark - Save photo @@ -684,54 +466,36 @@ - (void)savePhotoWithImage:(UIImage *)image completion:(void (^)(NSError *error) } - (void)savePhotoWithImage:(UIImage *)image location:(CLLocation *)location completion:(void (^)(NSError *error))completion { - if (iOS8Later) { - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - if (@available(iOS 9, *)) { - NSData *data = UIImageJPEGRepresentation(image, 0.9); - PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init]; - options.shouldMoveFile = YES; - PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset]; - [request addResourceWithType:PHAssetResourceTypePhoto data:data options:options]; - if (location) { - request.location = location; - } - request.creationDate = [NSDate date]; - } else { - PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; - if (location) { - request.location = location; - } - request.creationDate = [NSDate date]; + [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ + if (@available(iOS 9, *)) { + NSData *data = UIImageJPEGRepresentation(image, 0.9); + PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init]; + options.shouldMoveFile = YES; + PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset]; + [request addResourceWithType:PHAssetResourceTypePhoto data:data options:options]; + if (location) { + request.location = location; } - } completionHandler:^(BOOL success, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (success && completion) { - completion(nil); - } else if (error) { - NSLog(@"保存照片出错:%@",error.localizedDescription); - if (completion) { - completion(error); - } - } - }); - }]; - } else { - [self.assetLibrary writeImageToSavedPhotosAlbum:image.CGImage orientation:[self orientationFromImage:image] completionBlock:^(NSURL *assetURL, NSError *error) { - if (error) { - NSLog(@"保存图片失败:%@",error.localizedDescription); + request.creationDate = [NSDate date]; + } else { + PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; + if (location) { + request.location = location; + } + request.creationDate = [NSDate date]; + } + } completionHandler:^(BOOL success, NSError *error) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (success && completion) { + completion(nil); + } else if (error) { + NSLog(@"保存照片出错:%@",error.localizedDescription); if (completion) { completion(error); } - } else { - // 多给系统0.5秒的时间,让系统去更新相册数据 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if (completion) { - completion(nil); - } - }); } - }]; - } + }); + }]; } #pragma mark - Save video @@ -741,113 +505,81 @@ - (void)saveVideoWithUrl:(NSURL *)url completion:(void (^)(NSError *error))compl } - (void)saveVideoWithUrl:(NSURL *)url location:(CLLocation *)location completion:(void (^)(NSError *error))completion { - if (iOS8Later) { - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - if (@available(iOS 9, *)) { - PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init]; - options.shouldMoveFile = YES; - PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset]; - [request addResourceWithType:PHAssetResourceTypeVideo fileURL:url options:options]; - if (location) { - request.location = location; - } - request.creationDate = [NSDate date]; - } else { - PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url]; - if (location) { - request.location = location; - } - request.creationDate = [NSDate date]; + [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ + if (@available(iOS 9, *)) { + PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init]; + options.shouldMoveFile = YES; + PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset]; + [request addResourceWithType:PHAssetResourceTypeVideo fileURL:url options:options]; + if (location) { + request.location = location; } - } completionHandler:^(BOOL success, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (success && completion) { - completion(nil); - } else if (error) { - NSLog(@"保存视频出错:%@",error.localizedDescription); - if (completion) { - completion(error); - } - } - }); - }]; - } else { - [self.assetLibrary writeVideoAtPathToSavedPhotosAlbum:url completionBlock:^(NSURL *assetURL, NSError *error) { - if (error) { + request.creationDate = [NSDate date]; + } else { + PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url]; + if (location) { + request.location = location; + } + request.creationDate = [NSDate date]; + } + } completionHandler:^(BOOL success, NSError *error) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (success && completion) { + completion(nil); + } else if (error) { NSLog(@"保存视频出错:%@",error.localizedDescription); if (completion) { completion(error); } - } else { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if (completion) { - completion(nil); - } - }); } - }]; - } + }); + }]; } #pragma mark - Get Video /// Get Video / 获取视频 -- (void)getVideoWithAsset:(id)asset completion:(void (^)(AVPlayerItem *, NSDictionary *))completion { +- (void)getVideoWithAsset:(PHAsset *)asset completion:(void (^)(AVPlayerItem *, NSDictionary *))completion { [self getVideoWithAsset:asset progressHandler:nil completion:completion]; } -- (void)getVideoWithAsset:(id)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler completion:(void (^)(AVPlayerItem *, NSDictionary *))completion { - if ([asset isKindOfClass:[PHAsset class]]) { - PHVideoRequestOptions *option = [[PHVideoRequestOptions alloc] init]; - option.networkAccessAllowed = YES; - option.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (progressHandler) { - progressHandler(progress, error, stop, info); - } - }); - }; - [[PHImageManager defaultManager] requestPlayerItemForVideo:asset options:option resultHandler:^(AVPlayerItem *playerItem, NSDictionary *info) { - if (completion) completion(playerItem,info); - }]; - } else if ([asset isKindOfClass:[ALAsset class]]) { - ALAsset *alAsset = (ALAsset *)asset; - ALAssetRepresentation *defaultRepresentation = [alAsset defaultRepresentation]; - NSString *uti = [defaultRepresentation UTI]; - NSURL *videoURL = [[asset valueForProperty:ALAssetPropertyURLs] valueForKey:uti]; - AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:videoURL]; - if (completion && playerItem) completion(playerItem,nil); - } +- (void)getVideoWithAsset:(PHAsset *)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler completion:(void (^)(AVPlayerItem *, NSDictionary *))completion { + PHVideoRequestOptions *option = [[PHVideoRequestOptions alloc] init]; + option.networkAccessAllowed = YES; + option.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (progressHandler) { + progressHandler(progress, error, stop, info); + } + }); + }; + [[PHImageManager defaultManager] requestPlayerItemForVideo:asset options:option resultHandler:^(AVPlayerItem *playerItem, NSDictionary *info) { + if (completion) completion(playerItem,info); + }]; } #pragma mark - Export video /// Export Video / 导出视频 -- (void)getVideoOutputPathWithAsset:(id)asset success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure { +- (void)getVideoOutputPathWithAsset:(PHAsset *)asset success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure { [self getVideoOutputPathWithAsset:asset presetName:AVAssetExportPreset640x480 success:success failure:failure]; } -- (void)getVideoOutputPathWithAsset:(id)asset presetName:(NSString *)presetName success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure { - if ([asset isKindOfClass:[PHAsset class]]) { - PHVideoRequestOptions* options = [[PHVideoRequestOptions alloc] init]; - options.version = PHVideoRequestOptionsVersionOriginal; - options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic; - options.networkAccessAllowed = YES; - [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset* avasset, AVAudioMix* audioMix, NSDictionary* info){ - // NSLog(@"Info:\n%@",info); - AVURLAsset *videoAsset = (AVURLAsset*)avasset; - // NSLog(@"AVAsset URL: %@",myAsset.URL); - [self startExportVideoWithVideoAsset:videoAsset presetName:presetName success:success failure:failure]; - }]; - } else if ([asset isKindOfClass:[ALAsset class]]) { - NSURL *videoURL =[asset valueForProperty:ALAssetPropertyAssetURL]; // ALAssetPropertyURLs - AVURLAsset *videoAsset = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; +- (void)getVideoOutputPathWithAsset:(PHAsset *)asset presetName:(NSString *)presetName success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure { + PHVideoRequestOptions* options = [[PHVideoRequestOptions alloc] init]; + options.version = PHVideoRequestOptionsVersionOriginal; + options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic; + options.networkAccessAllowed = YES; + [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset* avasset, AVAudioMix* audioMix, NSDictionary* info){ + // NSLog(@"Info:\n%@",info); + AVURLAsset *videoAsset = (AVURLAsset*)avasset; + // NSLog(@"AVAsset URL: %@",myAsset.URL); [self startExportVideoWithVideoAsset:videoAsset presetName:presetName success:success failure:failure]; - } + }]; } /// Deprecated, Use -getVideoOutputPathWithAsset:failure:success: -- (void)getVideoOutputPathWithAsset:(id)asset completion:(void (^)(NSString *outputPath))completion { +- (void)getVideoOutputPathWithAsset:(PHAsset *)asset completion:(void (^)(NSString *outputPath))completion { [self getVideoOutputPathWithAsset:asset success:completion failure:nil]; } @@ -939,87 +671,39 @@ - (void)startExportVideoWithVideoAsset:(AVURLAsset *)videoAsset presetName:(NSSt } } -/// Judge is a assets array contain the asset 判断一个assets数组是否包含这个asset -- (BOOL)isAssetsArray:(NSArray *)assets containAsset:(id)asset { - if (iOS8Later) { - return [assets containsObject:asset]; - } else { - NSMutableArray *selectedAssetUrls = [NSMutableArray array]; - for (ALAsset *asset_item in assets) { - [selectedAssetUrls addObject:[asset_item valueForProperty:ALAssetPropertyURLs]]; - } - return [selectedAssetUrls containsObject:[asset valueForProperty:ALAssetPropertyURLs]]; - } -} - -- (BOOL)isCameraRollAlbum:(id)metadata { - if ([metadata isKindOfClass:[PHAssetCollection class]]) { - NSString *versionStr = [[UIDevice currentDevice].systemVersion stringByReplacingOccurrencesOfString:@"." withString:@""]; - if (versionStr.length <= 1) { - versionStr = [versionStr stringByAppendingString:@"00"]; - } else if (versionStr.length <= 2) { - versionStr = [versionStr stringByAppendingString:@"0"]; - } - CGFloat version = versionStr.floatValue; - // 目前已知8.0.0 ~ 8.0.2系统,拍照后的图片会保存在最近添加中 - if (version >= 800 && version <= 802) { - return ((PHAssetCollection *)metadata).assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumRecentlyAdded; - } else { - return ((PHAssetCollection *)metadata).assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumUserLibrary; - } - } - if ([metadata isKindOfClass:[ALAssetsGroup class]]) { - ALAssetsGroup *group = metadata; - return ([[group valueForProperty:ALAssetsGroupPropertyType] intValue] == ALAssetsGroupSavedPhotos); +- (BOOL)isCameraRollAlbum:(PHAssetCollection *)metadata { + NSString *versionStr = [[UIDevice currentDevice].systemVersion stringByReplacingOccurrencesOfString:@"." withString:@""]; + if (versionStr.length <= 1) { + versionStr = [versionStr stringByAppendingString:@"00"]; + } else if (versionStr.length <= 2) { + versionStr = [versionStr stringByAppendingString:@"0"]; } - - return NO; -} - -- (NSString *)getAssetIdentifier:(id)asset { - if (iOS8Later) { - PHAsset *phAsset = (PHAsset *)asset; - return phAsset.localIdentifier; + CGFloat version = versionStr.floatValue; + // 目前已知8.0.0 ~ 8.0.2系统,拍照后的图片会保存在最近添加中 + if (version >= 800 && version <= 802) { + return ((PHAssetCollection *)metadata).assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumRecentlyAdded; } else { - ALAsset *alAsset = (ALAsset *)asset; - NSURL *assetUrl = [alAsset valueForProperty:ALAssetPropertyAssetURL]; - return assetUrl.absoluteString; + return ((PHAssetCollection *)metadata).assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumUserLibrary; } } /// 检查照片大小是否满足最小要求 -- (BOOL)isPhotoSelectableWithAsset:(id)asset { - CGSize photoSize = [self photoSizeWithAsset:asset]; +- (BOOL)isPhotoSelectableWithAsset:(PHAsset *)asset { + CGSize photoSize = CGSizeMake(asset.pixelWidth, asset.pixelHeight); if (self.minPhotoWidthSelectable > photoSize.width || self.minPhotoHeightSelectable > photoSize.height) { return NO; } return YES; } -- (CGSize)photoSizeWithAsset:(id)asset { - if (iOS8Later) { - PHAsset *phAsset = (PHAsset *)asset; - return CGSizeMake(phAsset.pixelWidth, phAsset.pixelHeight); - } else { - ALAsset *alAsset = (ALAsset *)asset; - return alAsset.defaultRepresentation.dimensions; - } -} - #pragma mark - Private Method -- (TZAlbumModel *)modelWithResult:(id)result name:(NSString *)name isCameraRoll:(BOOL)isCameraRoll needFetchAssets:(BOOL)needFetchAssets { +- (TZAlbumModel *)modelWithResult:(PHFetchResult *)result name:(NSString *)name isCameraRoll:(BOOL)isCameraRoll needFetchAssets:(BOOL)needFetchAssets { TZAlbumModel *model = [[TZAlbumModel alloc] init]; [model setResult:result needFetchAssets:needFetchAssets]; model.name = name; model.isCameraRoll = isCameraRoll; - if ([result isKindOfClass:[PHFetchResult class]]) { - PHFetchResult *fetchResult = (PHFetchResult *)result; - model.count = fetchResult.count; - } else if ([result isKindOfClass:[ALAssetsGroup class]]) { - ALAssetsGroup *group = (ALAssetsGroup *)result; - model.count = [group numberOfAssets]; - } + model.count = result.count; return model; } @@ -1050,20 +734,8 @@ - (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size { } /// 判断asset是否是视频 -- (BOOL)isVideo:(id)asset { - if (iOS8Later) { - PHAsset *phAsset = asset; - return phAsset.mediaType == PHAssetMediaTypeVideo; - } else { - ALAsset *alAsset = asset; - NSString *alAssetType = [[alAsset valueForProperty:ALAssetPropertyType] stringValue]; - return [alAssetType isEqualToString:ALAssetTypeVideo]; - } -} - -- (ALAssetOrientation)orientationFromImage:(UIImage *)image { - NSInteger orientation = image.imageOrientation; - return orientation; +- (BOOL)isVideo:(PHAsset *)asset { + return asset.mediaType == PHAssetMediaTypeVideo; } /// 获取优化后的视频转向信息 diff --git a/TZImagePickerController/TZImagePickerController/TZImagePickerController.h b/TZImagePickerController/TZImagePickerController/TZImagePickerController.h index 64d3eb24..ce426021 100644 --- a/TZImagePickerController/TZImagePickerController/TZImagePickerController.h +++ b/TZImagePickerController/TZImagePickerController/TZImagePickerController.h @@ -25,9 +25,6 @@ #import "TZLocationManager.h" #import "TZPhotoPreviewController.h" -#define iOS7Later ([UIDevice currentDevice].systemVersion.floatValue >= 7.0f) -#define iOS8Later ([UIDevice currentDevice].systemVersion.floatValue >= 8.0f) - @class TZAlbumCell, TZAssetCell; @protocol TZImagePickerControllerDelegate; @interface TZImagePickerController : UINavigationController @@ -40,7 +37,7 @@ /// This init method just for previewing photos / 用这个初始化方法以预览图片 - (instancetype)initWithSelectedAssets:(NSMutableArray *)selectedAssets selectedPhotos:(NSMutableArray *)selectedPhotos index:(NSInteger)index; /// This init method for crop photo / 用这个初始化方法以裁剪图片 -- (instancetype)initCropTypeWithAsset:(id)asset photo:(UIImage *)photo completion:(void (^)(UIImage *cropImage,id asset))completion; +- (instancetype)initCropTypeWithAsset:(PHAsset *)asset photo:(UIImage *)photo completion:(void (^)(UIImage *cropImage,PHAsset *asset))completion; #pragma mark - /// Default is 9 / 默认最大可选9张图片 @@ -185,8 +182,8 @@ @property (nonatomic, copy) void (^albumCellDidLayoutSubviewsBlock)(TZAlbumCell *cell, UIImageView *posterImageView, UILabel *titleLabel); #pragma mark - -- (id)showAlertWithTitle:(NSString *)title; -- (void)hideAlertView:(id)alertView; +- (UIAlertController *)showAlertWithTitle:(NSString *)title; +- (void)hideAlertView:(UIAlertController *)alertView; - (void)showProgressHUD; - (void)hideProgressHUD; @property (nonatomic, assign) BOOL isSelectOriginalPhoto; @@ -247,10 +244,8 @@ @property (nonatomic, copy) void (^imagePickerControllerDidCancelHandle)(void); // If user picking a video, this handle will be called. -// If system version > iOS8,asset is kind of PHAsset class, else is ALAsset class. // 如果用户选择了一个视频,下面的handle会被执行 -// 如果系统版本大于iOS8,asset是PHAsset类的对象,否则是ALAsset类的对象 -@property (nonatomic, copy) void (^didFinishPickingVideoHandle)(UIImage *coverImage,id asset); +@property (nonatomic, copy) void (^didFinishPickingVideoHandle)(UIImage *coverImage,PHAsset *asset); // If user picking a gif image, this callback will be called. // 如果用户选择了一个gif图片,下面的handle会被执行 @@ -279,22 +274,20 @@ - (void)tz_imagePickerControllerDidCancel:(TZImagePickerController *)picker; // If user picking a video, this callback will be called. -// If system version > iOS8,asset is kind of PHAsset class, else is ALAsset class. // 如果用户选择了一个视频,下面的handle会被执行 -// 如果系统版本大于iOS8,asset是PHAsset类的对象,否则是ALAsset类的对象 -- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingVideo:(UIImage *)coverImage sourceAssets:(id)asset; +- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingVideo:(UIImage *)coverImage sourceAssets:(PHAsset *)asset; // If user picking a gif image, this callback will be called. // 如果用户选择了一个gif图片,下面的handle会被执行 -- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingGifImage:(UIImage *)animatedImage sourceAssets:(id)asset; +- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingGifImage:(UIImage *)animatedImage sourceAssets:(PHAsset *)asset; // Decide album show or not't // 决定相册显示与否 albumName:相册名字 result:相册原始数据 -- (BOOL)isAlbumCanSelect:(NSString *)albumName result:(id)result; +- (BOOL)isAlbumCanSelect:(NSString *)albumName result:(PHFetchResult *)result; // Decide asset show or not't // 决定照片显示与否 -- (BOOL)isAssetCanSelect:(id)asset; +- (BOOL)isAssetCanSelect:(PHAsset *)asset; @end @@ -310,12 +303,6 @@ @end -@interface NSString (TzExtension) -- (BOOL)tz_containsString:(NSString *)string; -- (CGSize)tz_calculateSizeWithAttributes:(NSDictionary *)attributes maxSize:(CGSize)maxSize; -@end - - @interface TZCommonTools : NSObject + (BOOL)tz_isIPhoneX; + (CGFloat)tz_statusBarHeight; diff --git a/TZImagePickerController/TZImagePickerController/TZImagePickerController.m b/TZImagePickerController/TZImagePickerController/TZImagePickerController.m index b9370e36..d6c08a57 100644 --- a/TZImagePickerController/TZImagePickerController/TZImagePickerController.m +++ b/TZImagePickerController/TZImagePickerController/TZImagePickerController.m @@ -60,19 +60,15 @@ - (void)viewDidLoad { self.oKButtonTitleColorNormal = [UIColor colorWithRed:(83/255.0) green:(179/255.0) blue:(17/255.0) alpha:1.0]; self.oKButtonTitleColorDisabled = [UIColor colorWithRed:(83/255.0) green:(179/255.0) blue:(17/255.0) alpha:0.5]; - if (iOS7Later) { - self.navigationBar.barTintColor = [UIColor colorWithRed:(34/255.0) green:(34/255.0) blue:(34/255.0) alpha:1.0]; - self.navigationBar.tintColor = [UIColor whiteColor]; - self.automaticallyAdjustsScrollViewInsets = NO; - if (self.needShowStatusBar) [UIApplication sharedApplication].statusBarHidden = NO; - } + self.navigationBar.barTintColor = [UIColor colorWithRed:(34/255.0) green:(34/255.0) blue:(34/255.0) alpha:1.0]; + self.navigationBar.tintColor = [UIColor whiteColor]; + self.automaticallyAdjustsScrollViewInsets = NO; + if (self.needShowStatusBar) [UIApplication sharedApplication].statusBarHidden = NO; } - (void)setNaviBgColor:(UIColor *)naviBgColor { _naviBgColor = naviBgColor; - if (iOS7Later) { - self.navigationBar.barTintColor = naviBgColor; - } + self.navigationBar.barTintColor = naviBgColor; } - (void)setNaviTitleColor:(UIColor *)naviTitleColor { @@ -110,9 +106,9 @@ - (void)setIsStatusBarDefault:(BOOL)isStatusBarDefault { _isStatusBarDefault = isStatusBarDefault; if (isStatusBarDefault) { - self.statusBarStyle = iOS7Later ? UIStatusBarStyleDefault : UIStatusBarStyleBlackOpaque; + self.statusBarStyle = UIStatusBarStyleDefault; } else { - self.statusBarStyle = iOS7Later ? UIStatusBarStyleLightContent : UIStatusBarStyleBlackOpaque; + self.statusBarStyle = UIStatusBarStyleLightContent; } } @@ -192,14 +188,12 @@ - (instancetype)initWithMaxImagesCount:(NSInteger)maxImagesCount columnNumber:(N _tipLabel.text = tipText; [self.view addSubview:_tipLabel]; - if (iOS8Later) { - _settingBtn = [UIButton buttonWithType:UIButtonTypeSystem]; - [_settingBtn setTitle:self.settingBtnTitleStr forState:UIControlStateNormal]; - _settingBtn.frame = CGRectMake(0, 180, self.view.tz_width, 44); - _settingBtn.titleLabel.font = [UIFont systemFontOfSize:18]; - [_settingBtn addTarget:self action:@selector(settingBtnClick) forControlEvents:UIControlEventTouchUpInside]; - [self.view addSubview:_settingBtn]; - } + _settingBtn = [UIButton buttonWithType:UIButtonTypeSystem]; + [_settingBtn setTitle:self.settingBtnTitleStr forState:UIControlStateNormal]; + _settingBtn.frame = CGRectMake(0, 180, self.view.tz_width, 44); + _settingBtn.titleLabel.font = [UIFont systemFontOfSize:18]; + [_settingBtn addTarget:self action:@selector(settingBtnClick) forControlEvents:UIControlEventTouchUpInside]; + [self.view addSubview:_settingBtn]; if ([TZImageManager authorizationStatus] == 0) { _timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(observeAuthrizationStatusChange) userInfo:nil repeats:NO]; @@ -237,7 +231,7 @@ - (instancetype)initWithSelectedAssets:(NSMutableArray *)selectedAssets selected } /// This init method for crop photo / 用这个初始化方法以裁剪图片 -- (instancetype)initCropTypeWithAsset:(id)asset photo:(UIImage *)photo completion:(void (^)(UIImage *cropImage,id asset))completion { +- (instancetype)initCropTypeWithAsset:(PHAsset *)asset photo:(UIImage *)photo completion:(void (^)(UIImage *cropImage,PHAsset *asset))completion { TZPhotoPreviewController *previewVc = [[TZPhotoPreviewController alloc] init]; self = [super initWithRootViewController:previewVc]; if (self) { @@ -402,27 +396,15 @@ - (void)pushPhotoPickerVc { } } -- (id)showAlertWithTitle:(NSString *)title { - if (iOS8Later) { - UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleAlert]; - [alertController addAction:[UIAlertAction actionWithTitle:[NSBundle tz_localizedStringForKey:@"OK"] style:UIAlertActionStyleDefault handler:nil]]; - [self presentViewController:alertController animated:YES completion:nil]; - return alertController; - } else { - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:nil delegate:nil cancelButtonTitle:[NSBundle tz_localizedStringForKey:@"OK"] otherButtonTitles:nil, nil]; - [alertView show]; - return alertView; - } +- (UIAlertController *)showAlertWithTitle:(NSString *)title { + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleAlert]; + [alertController addAction:[UIAlertAction actionWithTitle:[NSBundle tz_localizedStringForKey:@"OK"] style:UIAlertActionStyleDefault handler:nil]]; + [self presentViewController:alertController animated:YES completion:nil]; + return alertController; } -- (void)hideAlertView:(id)alertView { - if ([alertView isKindOfClass:[UIAlertController class]]) { - UIAlertController *alertC = alertView; - [alertC dismissViewControllerAnimated:YES completion:nil]; - } else if ([alertView isKindOfClass:[UIAlertView class]]) { - UIAlertView *alertV = alertView; - [alertV dismissWithClickedButtonIndex:0 animated:YES]; - } +- (void)hideAlertView:(UIAlertController *)alertView { + [alertView dismissViewControllerAnimated:YES completion:nil]; alertView = nil; } @@ -564,7 +546,7 @@ - (void)setSelectedAssets:(NSMutableArray *)selectedAssets { _selectedAssets = selectedAssets; _selectedModels = [NSMutableArray array]; _selectedAssetIds = [NSMutableArray array]; - for (id asset in selectedAssets) { + for (PHAsset *asset in selectedAssets) { TZAssetModel *model = [TZAssetModel modelWithAsset:asset type:[[TZImageManager manager] getAssetType:asset]]; model.isSelected = YES; [self addSelectedModel:model]; @@ -609,9 +591,7 @@ - (void)settingBtnClick { } - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { - if (iOS7Later) { - viewController.automaticallyAdjustsScrollViewInsets = NO; - } + viewController.automaticallyAdjustsScrollViewInsets = NO; [super pushViewController:viewController animated:animated]; } @@ -621,14 +601,12 @@ - (void)dealloc { - (void)addSelectedModel:(TZAssetModel *)model { [_selectedModels addObject:model]; - NSString *assetId = [[TZImageManager manager] getAssetIdentifier:model.asset]; - [_selectedAssetIds addObject:assetId]; + [_selectedAssetIds addObject:model.asset.localIdentifier]; } - (void)removeSelectedModel:(TZAssetModel *)model { [_selectedModels removeObject:model]; - NSString *assetId = [[TZImageManager manager] getAssetIdentifier:model.asset]; - [_selectedAssetIds removeObject:assetId]; + [_selectedAssetIds removeObject:model.asset.localIdentifier]; } - (UIImage *)createImageWithColor:(UIColor *)color size:(CGSize)size radius:(CGFloat)radius { @@ -650,7 +628,11 @@ - (UIImage *)createImageWithColor:(UIColor *)color size:(CGSize)size radius:(CGF #pragma mark - UIContentContainer - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { - [self willInterfaceOrientionChange]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.02 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + if (![UIApplication sharedApplication].statusBarHidden) { + if (self.needShowStatusBar) [UIApplication sharedApplication].statusBarHidden = NO; + } + }); if (size.width > size.height) { _cropRect = _cropRectLandscape; } else { @@ -658,23 +640,6 @@ - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id= 3) { - _cropRect = _cropRectLandscape; - } else { - _cropRect = _cropRectPortrait; - } -} - -- (void)willInterfaceOrientionChange { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.02 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if (![UIApplication sharedApplication].statusBarHidden) { - if (iOS7Later && self.needShowStatusBar) [UIApplication sharedApplication].statusBarHidden = NO; - } - }); -} - #pragma mark - Layout - (void)viewDidLayoutSubviews { @@ -799,7 +764,7 @@ - (void)viewDidLayoutSubviews { BOOL isStatusBarHidden = [UIApplication sharedApplication].isStatusBarHidden; if (self.navigationController.navigationBar.isTranslucent) { top = naviBarHeight; - if (iOS7Later && !isStatusBarHidden) top += [TZCommonTools tz_statusBarHeight]; + if (!isStatusBarHidden) top += [TZCommonTools tz_statusBarHeight]; tableViewHeight = self.view.tz_height - top; } else { tableViewHeight = self.view.tz_height; @@ -856,33 +821,6 @@ + (UIImage *)imageNamedFromMyBundle:(NSString *)name { @end -@implementation NSString (TzExtension) - -- (BOOL)tz_containsString:(NSString *)string { - if (iOS8Later) { - return [self containsString:string]; - } else { - NSRange range = [self rangeOfString:string]; - return range.location != NSNotFound; - } -} - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -- (CGSize)tz_calculateSizeWithAttributes:(NSDictionary *)attributes maxSize:(CGSize)maxSize { - CGSize size; - if (iOS7Later) { - size = [self boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading attributes:attributes context:nil].size; - } else { - size = [self sizeWithFont:attributes[NSFontAttributeName] constrainedToSize:maxSize]; - } - return size; -} -#pragma clang diagnostic pop - -@end - - @implementation TZCommonTools + (BOOL)tz_isIPhoneX { diff --git a/TZImagePickerController/TZImagePickerController/TZLocationManager.m b/TZImagePickerController/TZImagePickerController/TZLocationManager.m index cf9b8ff8..8f244b6b 100644 --- a/TZImagePickerController/TZImagePickerController/TZLocationManager.m +++ b/TZImagePickerController/TZImagePickerController/TZLocationManager.m @@ -28,9 +28,7 @@ + (instancetype)manager { manager = [[self alloc] init]; manager.locationManager = [[CLLocationManager alloc] init]; manager.locationManager.delegate = manager; - if (iOS8Later) { - [manager.locationManager requestWhenInUseAuthorization]; - } + [manager.locationManager requestWhenInUseAuthorization]; }); return manager; } diff --git a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m index 37dea47b..904dabe5 100755 --- a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m +++ b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m @@ -56,9 +56,7 @@ - (UIImagePickerController *)imagePickerVc { _imagePickerVc = [[UIImagePickerController alloc] init]; _imagePickerVc.delegate = self; // set appearance / 改变相册选择页的导航栏外观 - if (iOS7Later) { - _imagePickerVc.navigationBar.barTintColor = self.navigationController.navigationBar.barTintColor; - } + _imagePickerVc.navigationBar.barTintColor = self.navigationController.navigationBar.barTintColor; _imagePickerVc.navigationBar.tintColor = self.navigationController.navigationBar.tintColor; UIBarButtonItem *tzBarItem, *BarItem; if (@available(iOS 9, *)) { @@ -103,14 +101,14 @@ - (void)fetchAssetModels { [tzImagePickerVc showProgressHUD]; } dispatch_async(dispatch_get_global_queue(0, 0), ^{ - if (!tzImagePickerVc.sortAscendingByModificationDate && self->_isFirstAppear && iOS8Later && self->_model.isCameraRoll) { + if (!tzImagePickerVc.sortAscendingByModificationDate && self->_isFirstAppear && self->_model.isCameraRoll) { [[TZImageManager manager] getCameraRollAlbum:tzImagePickerVc.allowPickingVideo allowPickingImage:tzImagePickerVc.allowPickingImage needFetchAssets:YES completion:^(TZAlbumModel *model) { self->_model = model; self->_models = [NSMutableArray arrayWithArray:self->_model.models]; [self initSubviews]; }]; } else { - if (self->_showTakePhotoBtn || !iOS8Later || self->_isFirstAppear) { + if (self->_showTakePhotoBtn || self->_isFirstAppear) { [[TZImageManager manager] getAssetsFromFetchResult:self->_model.result completion:^(NSArray *models) { self->_models = [NSMutableArray arrayWithArray:models]; [self initSubviews]; @@ -183,9 +181,7 @@ - (void)viewWillAppear:(BOOL)animated { - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - if (iOS8Later) { - // [self updateCachedAssets]; - } + // [self updateCachedAssets]; } - (void)configBottomToolBar { @@ -283,7 +279,7 @@ - (void)viewDidLayoutSubviews { CGFloat toolBarHeight = [TZCommonTools tz_isIPhoneX] ? 50 + (83 - 49) : 50; if (self.navigationController.navigationBar.isTranslucent) { top = naviBarHeight; - if (iOS7Later && !isStatusBarHidden) top += [TZCommonTools tz_statusBarHeight]; + if (!isStatusBarHidden) top += [TZCommonTools tz_statusBarHeight]; collectionViewHeight = tzImagePickerVc.showSelectBtn ? self.view.tz_height - toolBarHeight - top : self.view.tz_height - top;; } else { collectionViewHeight = tzImagePickerVc.showSelectBtn ? self.view.tz_height - toolBarHeight : self.view.tz_height; @@ -303,19 +299,19 @@ - (void)viewDidLayoutSubviews { if (!self.navigationController.navigationBar.isHidden) { toolBarTop = self.view.tz_height - toolBarHeight; } else { - CGFloat navigationHeight = naviBarHeight; - if (iOS7Later) navigationHeight += [TZCommonTools tz_statusBarHeight]; + CGFloat navigationHeight = naviBarHeight + [TZCommonTools tz_statusBarHeight]; toolBarTop = self.view.tz_height - toolBarHeight - navigationHeight; } _bottomToolBar.frame = CGRectMake(0, toolBarTop, self.view.tz_width, toolBarHeight); - CGFloat previewWidth = [tzImagePickerVc.previewBtnTitleStr tz_calculateSizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]} maxSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)].width + 2; + + CGFloat previewWidth = [tzImagePickerVc.previewBtnTitleStr boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]} context:nil].size.width + 2; if (!tzImagePickerVc.allowPreview) { previewWidth = 0.0; } _previewButton.frame = CGRectMake(10, 3, previewWidth, 44); _previewButton.tz_width = !tzImagePickerVc.showSelectBtn ? 0 : previewWidth; if (tzImagePickerVc.allowPickingOriginalPhoto) { - CGFloat fullImageWidth = [tzImagePickerVc.fullImageBtnTitleStr tz_calculateSizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13]} maxSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)].width; + CGFloat fullImageWidth = [tzImagePickerVc.fullImageBtnTitleStr boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13]} context:nil].size.width; _originalPhotoButton.frame = CGRectMake(CGRectGetMaxX(_previewButton.frame), 0, fullImageWidth + 56, 50); _originalPhotoLabel.frame = CGRectMake(fullImageWidth + 46, 0, 80, 50); } @@ -382,7 +378,7 @@ - (void)doneButtonClick { __block BOOL havenotShowAlert = YES; [TZImageManager manager].shouldFixOrientation = YES; - __block id alertView; + __block UIAlertController *alertView; for (NSInteger i = 0; i < tzImagePickerVc.selectedModels.count; i++) { TZAssetModel *model = tzImagePickerVc.selectedModels[i]; [[TZImageManager manager] getPhotoWithAsset:model.asset completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { @@ -503,8 +499,7 @@ - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cell cell.allowPickingGif = tzImagePickerVc.allowPickingGif; cell.model = model; if (model.isSelected && tzImagePickerVc.showSelectedIndex) { - NSString *assetId = [[TZImageManager manager] getAssetIdentifier:model.asset]; - cell.index = [tzImagePickerVc.selectedAssetIds indexOfObject:assetId] + 1; + cell.index = [tzImagePickerVc.selectedAssetIds indexOfObject:model.asset.localIdentifier] + 1; } cell.showSelectBtn = tzImagePickerVc.showSelectBtn; cell.allowPreview = tzImagePickerVc.allowPreview; @@ -530,7 +525,7 @@ - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cell model.isSelected = NO; NSArray *selectedModels = [NSArray arrayWithArray:tzImagePickerVc.selectedModels]; for (TZAssetModel *model_item in selectedModels) { - if ([[[TZImageManager manager] getAssetIdentifier:model.asset] isEqualToString:[[TZImageManager manager] getAssetIdentifier:model_item.asset]]) { + if ([model.asset.localIdentifier isEqualToString:model_item.asset.localIdentifier]) { [tzImagePickerVc removeSelectedModel:model_item]; break; } @@ -608,9 +603,7 @@ - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPa #pragma mark - UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView { - if (iOS8Later) { - // [self updateCachedAssets]; - } + // [self updateCachedAssets]; } #pragma mark - Private Method @@ -626,7 +619,7 @@ - (void)setUseCachedImageAndReloadData { /// 拍照按钮点击事件 - (void)takePhoto { AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; - if ((authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied) && iOS7Later) { + if ((authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied)) { NSDictionary *infoDict = [TZCommonTools tz_getInfoDictionary]; // 无权限 做一个友好的提示 @@ -634,26 +627,17 @@ - (void)takePhoto { if (!appName) appName = [infoDict valueForKey:@"CFBundleName"]; NSString *message = [NSString stringWithFormat:[NSBundle tz_localizedStringForKey:@"Please allow %@ to access your camera in \"Settings -> Privacy -> Camera\""],appName]; - if (iOS8Later) { - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSBundle tz_localizedStringForKey:@"Can not use camera"] message:message delegate:self cancelButtonTitle:[NSBundle tz_localizedStringForKey:@"Cancel"] otherButtonTitles:[NSBundle tz_localizedStringForKey:@"Setting"], nil]; - [alert show]; - } else { - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSBundle tz_localizedStringForKey:@"Can not use camera"] message:message delegate:self cancelButtonTitle:[NSBundle tz_localizedStringForKey:@"OK"] otherButtonTitles:nil]; - [alert show]; - } + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSBundle tz_localizedStringForKey:@"Can not use camera"] message:message delegate:self cancelButtonTitle:[NSBundle tz_localizedStringForKey:@"Cancel"] otherButtonTitles:[NSBundle tz_localizedStringForKey:@"Setting"], nil]; + [alert show]; } else if (authStatus == AVAuthorizationStatusNotDetermined) { // fix issue 466, 防止用户首次拍照拒绝授权时相机页黑屏 - if (iOS7Later) { - [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { - if (granted) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self pushImagePickerController]; - }); - } - }]; - } else { - [self pushImagePickerController]; - } + [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { + if (granted) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self pushImagePickerController]; + }); + } + }]; } else { [self pushImagePickerController]; } @@ -686,9 +670,7 @@ - (void)pushImagePickerController { self.imagePickerVc.videoMaximumDuration = tzImagePickerVc.videoMaximumDuration; } self.imagePickerVc.mediaTypes= mediaTypes; - if (iOS8Later) { - _imagePickerVc.modalPresentationStyle = UIModalPresentationOverCurrentContext; - } + _imagePickerVc.modalPresentationStyle = UIModalPresentationOverCurrentContext; if (tzImagePickerVc.uiImagePickerControllerSettingBlock) { tzImagePickerVc.uiImagePickerControllerSettingBlock(_imagePickerVc); } @@ -781,7 +763,7 @@ - (void)checkSelectedModels { } for (TZAssetModel *model in _models) { model.isSelected = NO; - if ([[TZImageManager manager] isAssetsArray:selectedAssets containAsset:model.asset]) { + if ([selectedAssets containsObject:model.asset]) { model.isSelected = YES; } } @@ -791,9 +773,7 @@ - (void)checkSelectedModels { - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 1) { // 去设置界面,开启相机访问权限 - if (iOS8Later) { - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; - } + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; } } diff --git a/TZImagePickerController/TZImagePickerController/TZPhotoPreviewCell.m b/TZImagePickerController/TZImagePickerController/TZPhotoPreviewCell.m index aa479695..7ef19dc9 100644 --- a/TZImagePickerController/TZImagePickerController/TZPhotoPreviewCell.m +++ b/TZImagePickerController/TZImagePickerController/TZPhotoPreviewCell.m @@ -188,7 +188,7 @@ - (void)setModel:(TZAssetModel *)model { } } -- (void)setAsset:(id)asset { +- (void)setAsset:(PHAsset *)asset { if (_asset && self.imageRequestID) { [[PHImageManager defaultManager] cancelImageRequest:self.imageRequestID]; } @@ -412,7 +412,7 @@ - (void)playButtonClick { if (currentTime.value == durationTime.value) [_player.currentItem seekToTime:CMTimeMake(0, 1)]; [_player play]; [_playButton setImage:nil forState:UIControlStateNormal]; - if (iOS7Later) [UIApplication sharedApplication].statusBarHidden = YES; + [UIApplication sharedApplication].statusBarHidden = YES; if (self.singleTapGestureBlock) { self.singleTapGestureBlock(); } diff --git a/TZImagePickerController/TZImagePickerController/TZPhotoPreviewController.m b/TZImagePickerController/TZImagePickerController/TZPhotoPreviewController.m index f6e4decd..32c003b9 100644 --- a/TZImagePickerController/TZImagePickerController/TZPhotoPreviewController.m +++ b/TZImagePickerController/TZImagePickerController/TZPhotoPreviewController.m @@ -41,7 +41,7 @@ @interface TZPhotoPreviewController () -#import #import "TZImagePickerController/TZImagePickerController.h" @implementation TZTestCell @@ -56,18 +55,11 @@ - (void)layoutSubviews { _videoImageView.frame = CGRectMake(width, width, width, width); } -- (void)setAsset:(id)asset { +- (void)setAsset:(PHAsset *)asset { _asset = asset; - if ([asset isKindOfClass:[PHAsset class]]) { - PHAsset *phAsset = asset; - _videoImageView.hidden = phAsset.mediaType != PHAssetMediaTypeVideo; - _gifLable.hidden = ![[phAsset valueForKey:@"filename"] tz_containsString:@"GIF"]; - } else if ([asset isKindOfClass:[ALAsset class]]) { - ALAsset *alAsset = asset; - _videoImageView.hidden = ![[alAsset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]; - _gifLable.hidden = YES; - } - } + _videoImageView.hidden = asset.mediaType != PHAssetMediaTypeVideo; + _gifLable.hidden = ![[asset valueForKey:@"filename"] containsString:@"GIF"]; +} - (void)setRow:(NSInteger)row { _row = row; diff --git a/TZImagePickerController/ViewController.m b/TZImagePickerController/ViewController.m index 40e2ec7b..2116c42f 100644 --- a/TZImagePickerController/ViewController.m +++ b/TZImagePickerController/ViewController.m @@ -10,7 +10,6 @@ #import "TZImagePickerController.h" #import "UIView+Layout.h" #import "TZTestCell.h" -#import #import #import "LxGridViewFlowLayout.h" #import "TZImageManager.h" @@ -61,9 +60,7 @@ - (UIImagePickerController *)imagePickerVc { _imagePickerVc = [[UIImagePickerController alloc] init]; _imagePickerVc.delegate = self; // set appearance / 改变相册选择页的导航栏外观 - if (iOS7Later) { - _imagePickerVc.navigationBar.barTintColor = self.navigationController.navigationBar.barTintColor; - } + _imagePickerVc.navigationBar.barTintColor = self.navigationController.navigationBar.barTintColor; _imagePickerVc.navigationBar.tintColor = self.navigationController.navigationBar.tintColor; UIBarButtonItem *tzBarItem, *BarItem; if (@available(iOS 9, *)) { @@ -193,16 +190,10 @@ - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPa [self pushTZImagePickerController]; } } else { // preview photos or video / 预览照片或者视频 - id asset = _selectedAssets[indexPath.item]; + PHAsset *asset = _selectedAssets[indexPath.item]; BOOL isVideo = NO; - if ([asset isKindOfClass:[PHAsset class]]) { - PHAsset *phAsset = asset; - isVideo = phAsset.mediaType == PHAssetMediaTypeVideo; - } else if ([asset isKindOfClass:[ALAsset class]]) { - ALAsset *alAsset = asset; - isVideo = [[alAsset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]; - } - if ([[asset valueForKey:@"filename"] tz_containsString:@"GIF"] && self.allowPickingGifSwitch.isOn && !self.allowPickingMuitlpleVideoSwitch.isOn) { + isVideo = asset.mediaType == PHAssetMediaTypeVideo; + if ([[asset valueForKey:@"filename"] containsString:@"GIF"] && self.allowPickingGifSwitch.isOn && !self.allowPickingMuitlpleVideoSwitch.isOn) { TZGifPhotoPreviewController *vc = [[TZGifPhotoPreviewController alloc] init]; TZAssetModel *model = [TZAssetModel modelWithAsset:asset type:TZAssetModelMediaTypePhotoGif timeLength:@""]; vc.model = model; @@ -282,9 +273,7 @@ - (void)pushTZImagePickerController { // 2. Set the appearance // 2. 在这里设置imagePickerVc的外观 - // if (iOS7Later) { - // imagePickerVc.navigationBar.barTintColor = [UIColor greenColor]; - // } + // imagePickerVc.navigationBar.barTintColor = [UIColor greenColor]; // imagePickerVc.oKButtonTitleColorDisabled = [UIColor lightGrayColor]; // imagePickerVc.oKButtonTitleColorNormal = [UIColor greenColor]; // imagePickerVc.navigationBar.translucent = NO; @@ -385,37 +374,23 @@ - (void)navigationController:(UINavigationController *)navigationController didS - (void)takePhoto { AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; - if ((authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied) && iOS7Later) { + if (authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied) { // 无相机权限 做一个友好的提示 - if (iOS8Later) { - UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法使用相机" message:@"请在iPhone的""设置-隐私-相机""中允许访问相机" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置", nil]; - [alert show]; - } else { - UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法使用相机" message:@"请在iPhone的""设置-隐私-相机""中允许访问相机" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; - [alert show]; - } + UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法使用相机" message:@"请在iPhone的""设置-隐私-相机""中允许访问相机" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置", nil]; + [alert show]; } else if (authStatus == AVAuthorizationStatusNotDetermined) { // fix issue 466, 防止用户首次拍照拒绝授权时相机页黑屏 - if (iOS7Later) { - [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { - if (granted) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self takePhoto]; - }); - } - }]; - } else { - [self takePhoto]; - } + [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { + if (granted) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self takePhoto]; + }); + } + }]; // 拍照之前还需要检查相册权限 } else if ([TZImageManager authorizationStatus] == 2) { // 已被拒绝,没有相册权限,将无法保存拍的照片 - if (iOS8Later) { - UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法访问相册" message:@"请在iPhone的""设置-隐私-相册""中允许访问相册" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置", nil]; - [alert show]; - } else { - UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法访问相册" message:@"请在iPhone的""设置-隐私-相册""中允许访问相册" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; - [alert show]; - } + UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"无法访问相册" message:@"请在iPhone的""设置-隐私-相册""中允许访问相册" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置", nil]; + [alert show]; } else if ([TZImageManager authorizationStatus] == 0) { // 未请求过相册权限 [[TZImageManager manager] requestAuthorizationWithCompletion:^{ [self takePhoto]; @@ -450,9 +425,7 @@ - (void)pushImagePickerController { if (mediaTypes.count) { _imagePickerVc.mediaTypes = mediaTypes; } - if (iOS8Later) { - _imagePickerVc.modalPresentationStyle = UIModalPresentationOverCurrentContext; - } + _imagePickerVc.modalPresentationStyle = UIModalPresentationOverCurrentContext; [self presentViewController:_imagePickerVc animated:YES completion:nil]; } else { NSLog(@"模拟器中无法打开照相机,请在真机中使用"); @@ -523,7 +496,7 @@ - (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingM } } -- (void)refreshCollectionViewWithAddedAsset:(id)asset image:(UIImage *)image { +- (void)refreshCollectionViewWithAddedAsset:(PHAsset *)asset image:(UIImage *)image { [_selectedAssets addObject:asset]; [_selectedPhotos addObject:image]; [_collectionView reloadData]; @@ -544,9 +517,7 @@ - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 1) { // 去设置界面,开启相机访问权限 - if (iOS8Later) { - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; - } + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; } } @@ -576,10 +547,8 @@ - (void)imagePickerController:(TZImagePickerController *)picker didFinishPicking // 1.打印图片名字 [self printAssetsName:assets]; // 2.图片位置信息 - if (iOS8Later) { - for (PHAsset *phAsset in assets) { - NSLog(@"location:%@",phAsset.location); - } + for (PHAsset *phAsset in assets) { + NSLog(@"location:%@",phAsset.location); } /* @@ -603,10 +572,8 @@ - (void)imagePickerController:(TZImagePickerController *)picker didFinishPicking } // If user picking a video, this callback will be called. -// If system version > iOS8,asset is kind of PHAsset class, else is ALAsset class. // 如果用户选择了一个视频,下面的handle会被执行 -// 如果系统版本大于iOS8,asset是PHAsset类的对象,否则是ALAsset类的对象 -- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingVideo:(UIImage *)coverImage sourceAssets:(id)asset { +- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingVideo:(UIImage *)coverImage sourceAssets:(PHAsset *)asset { _selectedPhotos = [NSMutableArray arrayWithArray:@[coverImage]]; _selectedAssets = [NSMutableArray arrayWithArray:@[asset]]; // open this code to send video / 打开这段代码发送视频 @@ -623,7 +590,7 @@ - (void)imagePickerController:(TZImagePickerController *)picker didFinishPicking // If user picking a gif image, this callback will be called. // 如果用户选择了一个gif图片,下面的handle会被执行 -- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingGifImage:(UIImage *)animatedImage sourceAssets:(id)asset { +- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingGifImage:(UIImage *)animatedImage sourceAssets:(PHAsset *)asset { _selectedPhotos = [NSMutableArray arrayWithArray:@[animatedImage]]; _selectedAssets = [NSMutableArray arrayWithArray:@[asset]]; [_collectionView reloadData]; @@ -631,7 +598,7 @@ - (void)imagePickerController:(TZImagePickerController *)picker didFinishPicking // Decide album show or not't // 决定相册显示与否 -- (BOOL)isAlbumCanSelect:(NSString *)albumName result:(id)result { +- (BOOL)isAlbumCanSelect:(NSString *)albumName result:(PHFetchResult *)result { /* if ([albumName isEqualToString:@"个人收藏"]) { return NO; @@ -644,49 +611,30 @@ - (BOOL)isAlbumCanSelect:(NSString *)albumName result:(id)result { // Decide asset show or not't // 决定asset显示与否 -- (BOOL)isAssetCanSelect:(id)asset { +- (BOOL)isAssetCanSelect:(PHAsset *)asset { /* - if (iOS8Later) { - PHAsset *phAsset = asset; - switch (phAsset.mediaType) { - case PHAssetMediaTypeVideo: { - // 视频时长 - // NSTimeInterval duration = phAsset.duration; - return NO; - } break; - case PHAssetMediaTypeImage: { - // 图片尺寸 - if (phAsset.pixelWidth > 3000 || phAsset.pixelHeight > 3000) { - // return NO; - } - return YES; - } break; - case PHAssetMediaTypeAudio: - return NO; - break; - case PHAssetMediaTypeUnknown: - return NO; - break; - default: break; - } - } else { - ALAsset *alAsset = asset; - NSString *alAssetType = [[alAsset valueForProperty:ALAssetPropertyType] stringValue]; - if ([alAssetType isEqualToString:ALAssetTypeVideo]) { + switch (asset.mediaType) { + case PHAssetMediaTypeVideo: { // 视频时长 - // NSTimeInterval duration = [[alAsset valueForProperty:ALAssetPropertyDuration] doubleValue]; + // NSTimeInterval duration = phAsset.duration; return NO; - } else if ([alAssetType isEqualToString:ALAssetTypePhoto]) { + } break; + case PHAssetMediaTypeImage: { // 图片尺寸 - CGSize imageSize = alAsset.defaultRepresentation.dimensions; - if (imageSize.width > 3000) { + if (phAsset.pixelWidth > 3000 || phAsset.pixelHeight > 3000) { // return NO; } return YES; - } else if ([alAssetType isEqualToString:ALAssetTypeUnknown]) { + } break; + case PHAssetMediaTypeAudio: return NO; - } - }*/ + break; + case PHAssetMediaTypeUnknown: + return NO; + break; + default: break; + } + */ return YES; } @@ -794,14 +742,8 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { /// 打印图片名字 - (void)printAssetsName:(NSArray *)assets { NSString *fileName; - for (id asset in assets) { - if ([asset isKindOfClass:[PHAsset class]]) { - PHAsset *phAsset = (PHAsset *)asset; - fileName = [phAsset valueForKey:@"filename"]; - } else if ([asset isKindOfClass:[ALAsset class]]) { - ALAsset *alAsset = (ALAsset *)asset; - fileName = alAsset.defaultRepresentation.filename;; - } + for (PHAsset *asset in assets) { + fileName = [asset valueForKey:@"filename"]; // NSLog(@"图片名字:%@",fileName); } }