// // TZImagePickerController+MTImagePicker.m // Meet // // Created by ko1o on 2018/9/14. // Copyright © 2018年 ko1o. All rights reserved. // #import "TZImagePickerController+MTImagePicker.h" #import "UIImage+Extender.h" #import "UIControl+BlocksKit.h" #import "MTAlertView.h" #import "UIImage+PHAsset.h" #import "FLAnimatedImage.h" #import "TZImagePickerController/TZAssetCell.h" CGFloat kMTImagePickerDefaultWidthHeightRatio = (660 / 992.0 ); @interface TZImagePickerController (MTImagePicker) - (void)configDefaultSetting; @end @implementation TZImagePickerController (MTImagePicker) + (TZImagePickerController *)mt_imagePickerWithMaxImagesCount:(NSInteger)maxImagesCount didFinishPickingPhotosHandle:(void (^)(NSArray *photos,NSArray *assets,BOOL isSelectOriginalPhoto))didFinishPickingPhotosHandle { TZImagePickerController *imagePicker = [self mt_imagePickerWithMaxImagesCount:maxImagesCount delegate:nil]; WeakSelf(imagePicker); imagePicker.didFinishPickingPhotosHandle = ^(NSArray *photos, NSArray *assets, BOOL isSelectOriginalPhoto) { if (didFinishPickingPhotosHandle) { [weakimagePicker handleImagesWithAssets:assets resizedPhotos:photos completion:^(NSArray *photos, NSArray *assets) { didFinishPickingPhotosHandle(photos, assets, isSelectOriginalPhoto); }]; } }; imagePicker.didFinishPickingGifImageHandle = ^(UIImage *animatedImage, id sourceAssets) { if (didFinishPickingPhotosHandle) { didFinishPickingPhotosHandle(@[animatedImage], @[sourceAssets], NO); } }; return imagePicker; } + (TZImagePickerController *)mt_imagePickerWithMaxImagesCount:(NSInteger)maxImagesCount delegate:(id)delegate pushPhotoPickerVc:(BOOL)pushPhotoPickerVc { TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:maxImagesCount columnNumber:3 delegate:delegate pushPhotoPickerVc:pushPhotoPickerVc]; [imagePickerVc defaultSetup]; // [imagePickerVc setMt_naviBarHidden:imagePickerVc.maxImagesCount <= 1]; //隐藏顶部导航栏 imagePickerVc.showSelectBtn = YES; return imagePickerVc; } + (TZImagePickerController *)mt_videoPickerWithDidFinishPickVideoHandle:(void (^)(UIImage *coverImage, PHAsset *asset))didFinishPickVideoHandle { TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:1 columnNumber:3 delegate:nil pushPhotoPickerVc:YES]; [imagePickerVc defaultSetup]; imagePickerVc.allowPickingVideo = YES; imagePickerVc.allowPickingImage = NO; imagePickerVc.allowPickingGif = NO; imagePickerVc.showSelectBtn = YES; imagePickerVc.didFinishPickingVideoHandle = didFinishPickVideoHandle; return imagePickerVc; } + (TZImagePickerController *)mt_videoPreviewWithSelectedAsset:(PHAsset *)asset didFinishPickVideoHandle:(void (^)(UIImage *coverImage, PHAsset *asset))didFinishPickVideoHandle { if (!asset) { return nil; } TZVideoPlayerController *videoPlayer = [[TZVideoPlayerController alloc] init]; videoPlayer.model = [[TZImageManager manager] createModelWithAsset:asset]; TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithRootViewController:videoPlayer]; [imagePickerVc configDefaultSetting]; __weak typeof(imagePickerVc) _weakPicker = imagePickerVc; imagePickerVc.didFinishPickingVideoHandle = didFinishPickVideoHandle; return imagePickerVc; } + (TZImagePickerController *)mt_imagePickerWithMaxImagesCount:(NSInteger)maxImagesCount delegate:(id)delegate { return [self mt_imagePickerWithMaxImagesCount:maxImagesCount delegate:delegate pushPhotoPickerVc:YES]; } + (TZImagePickerController *)mt_imagePreviewWithSelectedAssets:(NSMutableArray *)selectedAssets selectedPhotos:(NSMutableArray *)selectedPhotos maxImagesCount:(NSInteger)maxImagesCount index:(NSInteger)index didFinishPreviewPhotosHandle:(void(^)(NSArray *photos, NSArray *assets, BOOL isSelectOriginalPhoto))didFinishPreviewPhotosHandle { TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithSelectedAssets:selectedAssets selectedPhotos:selectedPhotos index:index]; imagePickerVc.maxImagesCount = maxImagesCount; [imagePickerVc defaultSetup]; imagePickerVc.showSelectBtn = YES; imagePickerVc.statusBarStyle = UIStatusBarStyleLightContent; WeakSelf(imagePickerVc); imagePickerVc.didFinishPickingPhotosHandle = ^(NSArray *photos, NSArray *assets, BOOL isSelectOriginalPhoto) { if (didFinishPreviewPhotosHandle) { [weakimagePickerVc handleImagesWithAssets:assets resizedPhotos:photos completion:^(NSArray *photos, NSArray *assets) { didFinishPreviewPhotosHandle(photos, assets, isSelectOriginalPhoto); }]; } }; return imagePickerVc; } // 返回 UIImage or FLAniamteImage 数组 - (void)handleImagesWithAssets:(NSArray *)assets resizedPhotos:(NSArray *)photos completion:(void(^)(NSArray *photos, NSArray *assets))completion { NSArray *datas = assets; if (datas.count > 0 && assets.count == photos.count) { NSMutableArray *assetIdArr = [NSMutableArray array]; NSMutableDictionary *imgDic = [NSMutableDictionary dictionary]; [datas enumerateObjectsUsingBlock:^(PHAsset * _Nonnull asset, NSUInteger idx, BOOL * _Nonnull stop) { [assetIdArr addObject:asset.localIdentifier]; [UIImage getImageDataFromAsset:asset completion:^(NSData * _Nonnull data, NSString * _Nonnull suffix) { id image = nil; if ([[suffix lowercaseString] hasSuffix:@"gif"]) { // GIF image = [[FLAnimatedImage alloc] initWithAnimatedGIFData:data optimalFrameCacheSize:3 predrawingEnabled:YES]; } else { image = photos[idx]; } if (image) { [imgDic setValue:image forKey:asset.localIdentifier]; if ([imgDic allValues].count == datas.count) { // 解析完成 NSMutableArray *imagesM = [NSMutableArray array]; [assetIdArr enumerateObjectsUsingBlock:^(NSString * _Nonnull assetId, NSUInteger idx, BOOL * _Nonnull stop) { id image = imgDic[assetId]; if (image) { [imagesM addObject:image]; } }]; if (completion) { completion(imagesM, assets); } } } else { *stop = YES; NSLog(@"图片解析异常!!!!"); [SVProgressHUD showErrorWithStatus:@"图片解析异常~"]; if (completion) { completion(photos, assets); } } }]; }]; } } + (BOOL)showAlbumAuthorizeIfNeed { if ([PHPhotoLibrary authorizationStatus] == PHAuthorizationStatusDenied) { NSDictionary *infoDict = [TZCommonTools tz_getInfoDictionary]; NSString *appName = [infoDict valueForKey:@"CFBundleDisplayName"]; if (!appName) appName = [infoDict valueForKey:@"CFBundleName"]; NSString *tipText = [NSString stringWithFormat:[NSBundle tz_localizedStringForKey:@"Allow %@ to access your album in \"Settings -> Privacy -> Photos\""],appName]; [MTAlertView showWithSetupBlcok:^(MTAlertViewConfig *config) { config.message = tipText; config.cancelTitle = kMTAlertViewCancelTitle; config.otherTitle = @"去授权"; config.otherHandler = ^(MTAlertButton *button) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:nil completionHandler:nil]; }; }]; return YES; } else if ([PHPhotoLibrary authorizationStatus] == PHAuthorizationStatusNotDetermined) { dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); __block bool isAllow = NO; [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { if (status == PHAuthorizationStatusAuthorized) { isAllow = YES; } else{ isAllow = NO; //回到主线程 } dispatch_semaphore_signal(semaphore); }]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); return !isAllow; } return NO; } - (void)defaultSetup { TZImagePickerController *imagePickerVc = self; imagePickerVc.naviBgColor = [UIColor colorWithWhite:1 alpha:0.5]; imagePickerVc.naviTitleColor = [UIColor blackColor]; imagePickerVc.barItemTextColor = [UIColor blackColor]; imagePickerVc.naviTitleFont = MT_FONT_MEDIUM_SIZE(18); imagePickerVc.barItemTextFont = MT_FONT_MEDIUM_SIZE(17); imagePickerVc.statusBarStyle = UIStatusBarStyleDefault; imagePickerVc.modalPresentationStyle = UIModalPresentationOverFullScreen; imagePickerVc.navigationBar.shadowImage = [UIImage imageWithColor:COLOR_WITH_RGB(0xE9E9E9) size:CGSizeMake(SCREEN_WIDTH, 1)]; imagePickerVc.navigationBar.translucent = YES; // imagePickerVc.navLeftBarButtonSettingBlock = ^(UIButton *leftButton) { // leftButton.imageEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 10); // [leftButton setImage:ImageNamed(@"publish_imagepicker_back_icon") forState:UIControlStateNormal]; // }; imagePickerVc.photoWidth = 1024; // imagePickerVc.allowPreview = NO; imagePickerVc.allowTakeVideo = NO; imagePickerVc.allowPickingVideo = NO; imagePickerVc.allowPickingOriginalPhoto = NO;//选择原图 imagePickerVc.allowPickingGif = NO; imagePickerVc.allowPickingMultipleVideo = NO; imagePickerVc.allowTakePicture = NO; imagePickerVc.showSelectBtn = YES; // 2. Set the appearance // 2. 在这里设置imagePickerVc的外观 imagePickerVc.oKButtonTitleColorDisabled = [UIColor colorWithWhite:1.0 alpha:0.5]; imagePickerVc.oKButtonTitleColorNormal = [UIColor whiteColor]; imagePickerVc.naviBgColor = BG_COLOR; imagePickerVc.naviTitleColor = [UIColor whiteColor]; imagePickerVc.barItemTextColor = [UIColor whiteColor]; imagePickerVc.barItemTextFont = MT_FONT_REGULAR_SIZE(15); imagePickerVc.iconThemeColor = [UIColor colorWithRed:31 / 255.0 green:185 / 255.0 blue:34 / 255.0 alpha:1.0]; imagePickerVc.showPhotoCannotSelectLayer = YES; imagePickerVc.cannotSelectLayerColor = [[UIColor whiteColor] colorWithAlphaComponent:0.8]; __weak TZImagePickerController *weakPicker = imagePickerVc; imagePickerVc.photoPreviewPageUIConfigBlock = ^(UICollectionView *collectionView, UIView *naviBar, UIButton *backButton, UIButton *selectButton, UILabel *indexLabel, UIView *toolBar, UIButton *originalPhotoButton, UILabel *originalPhotoLabel, UIButton *doneButton, UIImageView *numberImageView, UILabel *numberLabel) { if ([weakPicker mt_naviBarHidden]) { naviBar.hidden = YES; UIButton * _backButton = [[UIButton alloc] initWithFrame:CGRectZero]; [_backButton setTitleColor:weakPicker.oKButtonTitleColorNormal forState:UIControlStateNormal]; [_backButton bk_addEventHandler:^(id _Nonnull sender) { [backButton sendActionsForControlEvents:UIControlEventTouchUpInside]; //转发取消按钮事件 } forControlEvents:(UIControlEvents)UIControlEventTouchUpInside]; _backButton.titleLabel.font = [UIFont fontWithName:@"PingFangSC-Regular" size:18]; [_backButton setTitle:weakPicker.cancelBtnTitleStr forState:UIControlStateNormal]; [toolBar addSubview:_backButton]; _backButton.tag = 999; } }; imagePickerVc.albumPickerPageDidLayoutSubviewsBlock = ^(UITableView *tableView) { tableView.backgroundColor = BG_COLOR; }; imagePickerVc.albumCellDidLayoutSubviewsBlock = ^(TZAlbumCell *cell, UIImageView *posterImageView, UILabel *titleLabel) { cell.backgroundColor = cell.contentView.backgroundColor = [UIColor clearColor]; }; imagePickerVc.photoPickerPageDidLayoutSubviewsBlock = ^(UICollectionView *collectionView, UIView *bottomToolBar, UIButton *previewButton, UIButton *originalPhotoButton, UILabel *originalPhotoLabel, UIButton *doneButton, UIImageView *numberImageView, UILabel *numberLabel, UIView *divideLine) { collectionView.backgroundColor = BG_COLOR; bottomToolBar.backgroundColor = BG_COLOR; divideLine.backgroundColor = LINE_COLOR; }; imagePickerVc.photoPreviewPageDidLayoutSubviewsBlock = ^(UICollectionView *collectionView, UIView *naviBar, UIButton *backButton, UIButton *selectButton, UILabel *indexLabel, UIView *toolBar, UIButton *originalPhotoButton, UILabel *originalPhotoLabel, UIButton *doneButton, UIImageView *numberImageView, UILabel *numberLabel) { UIButton * _backButton = [toolBar viewWithTag:999]; if (_backButton) { [_backButton sizeToFit]; _backButton.frame = CGRectMake(12, 0, _backButton.width, doneButton.height); } collectionView.backgroundColor = BG_COLOR; toolBar.backgroundColor = BG_COLOR; toolBar.height = MAX(44 + homeIndicatorHeight(), doneButton.height) ; toolBar.y = self.view.height - toolBar.height; if ([weakPicker mt_naviBarHidden]) { naviBar.hidden = YES; } }; } - (BOOL)mt_naviBarHidden { NSNumber *value = objc_getAssociatedObject(self, @selector(mt_naviBarHidden)); return [value boolValue]; } - (void)setMt_naviBarHidden:(BOOL)mt_naviBarHidden { objc_setAssociatedObject(self, @selector(mt_naviBarHidden), @(mt_naviBarHidden), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } + (void)mt_setImagePickerW3H4CropRect:(TZImagePickerController *)imagePickerVc showBottomHeartIcon:(BOOL)show { CGRect fullRect = [UIScreen mainScreen].bounds; NSInteger left = FIX_SIZE(45 * 0.5); NSInteger width = CGRectGetWidth(fullRect) - 2 * left; NSInteger height = width / kMTImagePickerDefaultWidthHeightRatio; NSInteger top = (CGRectGetHeight(fullRect) - height /* - HOME_INDICATOR_HEIHT - NAVIGATION_BAR_HEIGHT */) * 0.5; imagePickerVc.allowCrop = YES; imagePickerVc.cropRect = CGRectMake(left, top, width, height); // imagePickerVc.mt_cropBorderRadius = FIX_SIZE(10); imagePickerVc.cropViewSettingBlock = ^(UIView *cropView) { UIImageView *imageView = [[UIImageView alloc] initWithImage:ImageNamed(show ? @"facereport_add_bottom_icon": @"")]; [cropView addSubview:imageView]; cropView.layer.cornerRadius = FIX_SIZE(10); cropView.layer.borderWidth = 1.5; // cropView.backgroundColor = [UIColor redColor]; imageView.x = FIX_SIZE(15); imageView.width = cropView.width - imageView.x * 2; imageView.height = imageView.width * 190.0 / 659; imageView.y = cropView.height - FIX_SIZE(15) - imageView.height; }; } @end