From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001 From: 单军华 Date: Wed, 11 Jul 2018 10:47:42 +0800 Subject: [PATCH] 首次上传 --- screendisplay/Pods/TZImagePickerController/TZImagePickerController/TZImagePickerController/TZImagePickerController.m | 941 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 941 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/TZImagePickerController/TZImagePickerController/TZImagePickerController/TZImagePickerController.m b/screendisplay/Pods/TZImagePickerController/TZImagePickerController/TZImagePickerController/TZImagePickerController.m new file mode 100644 index 0000000..80c2319 --- /dev/null +++ b/screendisplay/Pods/TZImagePickerController/TZImagePickerController/TZImagePickerController/TZImagePickerController.m @@ -0,0 +1,941 @@ +// +// TZImagePickerController.m +// TZImagePickerController +// +// Created by ������ on 15/12/24. +// Copyright �� 2015��� ������. All rights reserved. +// version 2.1.6 - 2018.06.12 +// ���������������������������������github���������https://github.com/banchichen/TZImagePickerController + +#import "TZImagePickerController.h" +#import "TZPhotoPickerController.h" +#import "TZPhotoPreviewController.h" +#import "TZAssetModel.h" +#import "TZAssetCell.h" +#import "UIView+Layout.h" +#import "TZImageManager.h" +#import <sys/utsname.h> + +@interface TZImagePickerController () { + NSTimer *_timer; + UILabel *_tipLabel; + UIButton *_settingBtn; + BOOL _pushPhotoPickerVc; + BOOL _didPushPhotoPickerVc; + + UIButton *_progressHUD; + UIView *_HUDContainer; + UIActivityIndicatorView *_HUDIndicatorView; + UILabel *_HUDLabel; + + UIStatusBarStyle _originStatusBarStyle; +} +/// Default is 4, Use in photos collectionView in TZPhotoPickerController +/// ������4���, TZPhotoPickerController������������collectionView +@property (nonatomic, assign) NSInteger columnNumber; +@end + +@implementation TZImagePickerController + +- (instancetype)init { + self = [super init]; + if (self) { + self = [self initWithMaxImagesCount:9 delegate:nil]; + } + return self; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +- (void)viewDidLoad { + [super viewDidLoad]; + self.needShowStatusBar = ![UIApplication sharedApplication].statusBarHidden; + self.view.backgroundColor = [UIColor whiteColor]; + self.navigationBar.barStyle = UIBarStyleBlack; + self.navigationBar.translucent = YES; + [TZImageManager manager].shouldFixOrientation = NO; + + // Default appearance, you can reset these after this method + // ��������������������������������������������������� + 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; + } +} + +- (void)setNaviBgColor:(UIColor *)naviBgColor { + _naviBgColor = naviBgColor; + if (iOS7Later) { + self.navigationBar.barTintColor = naviBgColor; + } +} + +- (void)setNaviTitleColor:(UIColor *)naviTitleColor { + _naviTitleColor = naviTitleColor; + [self configNaviTitleAppearance]; +} + +- (void)setNaviTitleFont:(UIFont *)naviTitleFont { + _naviTitleFont = naviTitleFont; + [self configNaviTitleAppearance]; +} + +- (void)configNaviTitleAppearance { + NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary]; + if (self.naviTitleColor) { + textAttrs[NSForegroundColorAttributeName] = self.naviTitleColor; + } + if (self.naviTitleFont) { + textAttrs[NSFontAttributeName] = self.naviTitleFont; + } + self.navigationBar.titleTextAttributes = textAttrs; +} + +- (void)setBarItemTextFont:(UIFont *)barItemTextFont { + _barItemTextFont = barItemTextFont; + [self configBarButtonItemAppearance]; +} + +- (void)setBarItemTextColor:(UIColor *)barItemTextColor { + _barItemTextColor = barItemTextColor; + [self configBarButtonItemAppearance]; +} + +- (void)setIsStatusBarDefault:(BOOL)isStatusBarDefault { + _isStatusBarDefault = isStatusBarDefault; + + if (isStatusBarDefault) { + self.statusBarStyle = iOS7Later ? UIStatusBarStyleDefault : UIStatusBarStyleBlackOpaque; + } else { + self.statusBarStyle = iOS7Later ? UIStatusBarStyleLightContent : UIStatusBarStyleBlackOpaque; + } +} + +- (void)configBarButtonItemAppearance { + UIBarButtonItem *barItem; + if (iOS9Later) { + barItem = [UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[TZImagePickerController class]]]; + } else { + barItem = [UIBarButtonItem appearanceWhenContainedIn:[TZImagePickerController class], nil]; + } + NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary]; + textAttrs[NSForegroundColorAttributeName] = self.barItemTextColor; + textAttrs[NSFontAttributeName] = self.barItemTextFont; + [barItem setTitleTextAttributes:textAttrs forState:UIControlStateNormal]; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + _originStatusBarStyle = [UIApplication sharedApplication].statusBarStyle; + [UIApplication sharedApplication].statusBarStyle = self.statusBarStyle; +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + [UIApplication sharedApplication].statusBarStyle = _originStatusBarStyle; + [self hideProgressHUD]; +} + +- (UIStatusBarStyle)preferredStatusBarStyle { + return self.statusBarStyle; +} + +- (instancetype)initWithMaxImagesCount:(NSInteger)maxImagesCount delegate:(id<TZImagePickerControllerDelegate>)delegate { + return [self initWithMaxImagesCount:maxImagesCount columnNumber:4 delegate:delegate pushPhotoPickerVc:YES]; +} + +- (instancetype)initWithMaxImagesCount:(NSInteger)maxImagesCount columnNumber:(NSInteger)columnNumber delegate:(id<TZImagePickerControllerDelegate>)delegate { + return [self initWithMaxImagesCount:maxImagesCount columnNumber:columnNumber delegate:delegate pushPhotoPickerVc:YES]; +} + +- (instancetype)initWithMaxImagesCount:(NSInteger)maxImagesCount columnNumber:(NSInteger)columnNumber delegate:(id<TZImagePickerControllerDelegate>)delegate pushPhotoPickerVc:(BOOL)pushPhotoPickerVc { + _pushPhotoPickerVc = pushPhotoPickerVc; + TZAlbumPickerController *albumPickerVc = [[TZAlbumPickerController alloc] init]; + albumPickerVc.isFirstAppear = YES; + albumPickerVc.columnNumber = columnNumber; + self = [super initWithRootViewController:albumPickerVc]; + if (self) { + self.maxImagesCount = maxImagesCount > 0 ? maxImagesCount : 9; // Default is 9 / ������������������9��������� + self.pickerDelegate = delegate; + self.selectedAssets = [NSMutableArray array]; + + // Allow user picking original photo and video, you also can set No after this method + // ���������������������������������������, ������������������������������������NO + self.allowPickingOriginalPhoto = YES; + self.allowPickingVideo = YES; + self.allowPickingImage = YES; + self.allowTakePicture = YES; + self.allowTakeVideo = YES; + self.videoMaximumDuration = 10 * 60; + self.sortAscendingByModificationDate = YES; + self.autoDismiss = YES; + self.columnNumber = columnNumber; + [self configDefaultSetting]; + + if (![[TZImageManager manager] authorizationStatusAuthorized]) { + _tipLabel = [[UILabel alloc] init]; + _tipLabel.frame = CGRectMake(8, 120, self.view.tz_width - 16, 60); + _tipLabel.textAlignment = NSTextAlignmentCenter; + _tipLabel.numberOfLines = 0; + _tipLabel.font = [UIFont systemFontOfSize:16]; + _tipLabel.textColor = [UIColor blackColor]; + + 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]; + _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]; + } + + if ([TZImageManager authorizationStatus] == 0) { + _timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(observeAuthrizationStatusChange) userInfo:nil repeats:NO]; + } + } else { + [self pushPhotoPickerVc]; + } + } + return self; +} + +/// This init method just for previewing photos / ��������������������������������������� +- (instancetype)initWithSelectedAssets:(NSMutableArray *)selectedAssets selectedPhotos:(NSMutableArray *)selectedPhotos index:(NSInteger)index{ + TZPhotoPreviewController *previewVc = [[TZPhotoPreviewController alloc] init]; + self = [super initWithRootViewController:previewVc]; + if (self) { + self.selectedAssets = [NSMutableArray arrayWithArray:selectedAssets]; + self.allowPickingOriginalPhoto = self.allowPickingOriginalPhoto; + [self configDefaultSetting]; + + previewVc.photos = [NSMutableArray arrayWithArray:selectedPhotos]; + previewVc.currentIndex = index; + __weak typeof(self) weakSelf = self; + [previewVc setDoneButtonClickBlockWithPreviewType:^(NSArray<UIImage *> *photos, NSArray *assets, BOOL isSelectOriginalPhoto) { + __strong typeof(weakSelf) strongSelf = weakSelf; + [strongSelf dismissViewControllerAnimated:YES completion:^{ + if (!strongSelf) return; + if (strongSelf.didFinishPickingPhotosHandle) { + strongSelf.didFinishPickingPhotosHandle(photos,assets,isSelectOriginalPhoto); + } + }]; + }]; + } + return self; +} + +/// This init method for crop photo / ��������������������������������������� +- (instancetype)initCropTypeWithAsset:(id)asset photo:(UIImage *)photo completion:(void (^)(UIImage *cropImage,id asset))completion { + TZPhotoPreviewController *previewVc = [[TZPhotoPreviewController alloc] init]; + self = [super initWithRootViewController:previewVc]; + if (self) { + self.maxImagesCount = 1; + self.allowCrop = YES; + self.selectedAssets = [NSMutableArray arrayWithArray:@[asset]]; + [self configDefaultSetting]; + + previewVc.photos = [NSMutableArray arrayWithArray:@[photo]]; + previewVc.isCropImage = YES; + previewVc.currentIndex = 0; + __weak typeof(self) weakSelf = self; + [previewVc setDoneButtonClickBlockCropMode:^(UIImage *cropImage, id asset) { + __strong typeof(weakSelf) strongSelf = weakSelf; + [strongSelf dismissViewControllerAnimated:YES completion:^{ + if (completion) { + completion(cropImage,asset); + } + }]; + }]; + } + return self; +} + +- (void)configDefaultSetting { + self.timeout = 15; + self.photoWidth = 828.0; + self.photoPreviewMaxWidth = 600; + self.naviTitleColor = [UIColor whiteColor]; + self.naviTitleFont = [UIFont systemFontOfSize:17]; + self.barItemTextFont = [UIFont systemFontOfSize:15]; + self.barItemTextColor = [UIColor whiteColor]; + self.allowPreview = YES; + self.statusBarStyle = UIStatusBarStyleLightContent; + self.cannotSelectLayerColor = [[UIColor whiteColor] colorWithAlphaComponent:0.8]; + self.allowCameraLocation = YES; + + self.iconThemeColor = [UIColor colorWithRed:31 / 255.0 green:185 / 255.0 blue:34 / 255.0 alpha:1.0]; + [self configDefaultBtnTitle]; + + CGFloat cropViewWH = MIN(self.view.tz_width, self.view.tz_height) / 3 * 2; + self.cropRect = CGRectMake((self.view.tz_width - cropViewWH) / 2, (self.view.tz_height - cropViewWH) / 2, cropViewWH, cropViewWH); +} + +- (void)configDefaultImageName { + self.takePictureImageName = @"takePicture80"; + self.photoSelImageName = @"photo_sel_photoPickerVc"; + self.photoDefImageName = @"photo_def_photoPickerVc"; + self.photoNumberIconImage = [self createImageWithColor:nil size:CGSizeMake(48, 48) radius:24]; // @"photo_number_icon"; + self.photoPreviewOriginDefImageName = @"preview_original_def"; + self.photoOriginDefImageName = @"photo_original_def"; + self.photoOriginSelImageName = @"photo_original_sel"; +} + +- (void)setTakePictureImageName:(NSString *)takePictureImageName { + _takePictureImageName = takePictureImageName; + _takePictureImage = [UIImage imageNamedFromMyBundle:takePictureImageName]; +} + +- (void)setPhotoSelImageName:(NSString *)photoSelImageName { + _photoSelImageName = photoSelImageName; + _photoSelImage = [UIImage imageNamedFromMyBundle:photoSelImageName]; +} + +- (void)setPhotoDefImageName:(NSString *)photoDefImageName { + _photoDefImageName = photoDefImageName; + _photoDefImage = [UIImage imageNamedFromMyBundle:photoDefImageName]; +} + +- (void)setPhotoNumberIconImageName:(NSString *)photoNumberIconImageName { + _photoNumberIconImageName = photoNumberIconImageName; + _photoNumberIconImage = [UIImage imageNamedFromMyBundle:photoNumberIconImageName]; +} + +- (void)setPhotoPreviewOriginDefImageName:(NSString *)photoPreviewOriginDefImageName { + _photoPreviewOriginDefImageName = photoPreviewOriginDefImageName; + _photoPreviewOriginDefImage = [UIImage imageNamedFromMyBundle:photoPreviewOriginDefImageName]; +} + +- (void)setPhotoOriginDefImageName:(NSString *)photoOriginDefImageName { + _photoOriginDefImageName = photoOriginDefImageName; + _photoOriginDefImage = [UIImage imageNamedFromMyBundle:photoOriginDefImageName]; +} + +- (void)setPhotoOriginSelImageName:(NSString *)photoOriginSelImageName { + _photoOriginSelImageName = photoOriginSelImageName; + _photoOriginSelImage = [UIImage imageNamedFromMyBundle:photoOriginSelImageName]; +} + +- (void)setIconThemeColor:(UIColor *)iconThemeColor { + _iconThemeColor = iconThemeColor; + [self configDefaultImageName]; +} + +- (void)configDefaultBtnTitle { + self.doneBtnTitleStr = [NSBundle tz_localizedStringForKey:@"Done"]; + self.cancelBtnTitleStr = [NSBundle tz_localizedStringForKey:@"Cancel"]; + self.previewBtnTitleStr = [NSBundle tz_localizedStringForKey:@"Preview"]; + self.fullImageBtnTitleStr = [NSBundle tz_localizedStringForKey:@"Full image"]; + self.settingBtnTitleStr = [NSBundle tz_localizedStringForKey:@"Setting"]; + self.processHintStr = [NSBundle tz_localizedStringForKey:@"Processing..."]; +} + +- (void)setShowSelectedIndex:(BOOL)showSelectedIndex { + _showSelectedIndex = showSelectedIndex; + if (showSelectedIndex) { + self.photoSelImage = [self createImageWithColor:nil size:CGSizeMake(48, 48) radius:24]; + } + [TZImagePickerConfig sharedInstance].showSelectedIndex = showSelectedIndex; +} + +- (void)setShowPhotoCannotSelectLayer:(BOOL)showPhotoCannotSelectLayer { + _showPhotoCannotSelectLayer = showPhotoCannotSelectLayer; + [TZImagePickerConfig sharedInstance].showPhotoCannotSelectLayer = showPhotoCannotSelectLayer; +} + +- (void)observeAuthrizationStatusChange { + [_timer invalidate]; + _timer = nil; + if ([TZImageManager authorizationStatus] == 0) { + _timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(observeAuthrizationStatusChange) userInfo:nil repeats:NO]; + } + + if ([[TZImageManager manager] authorizationStatusAuthorized]) { + [_tipLabel removeFromSuperview]; + [_settingBtn removeFromSuperview]; + + [self pushPhotoPickerVc]; + + TZAlbumPickerController *albumPickerVc = (TZAlbumPickerController *)self.visibleViewController; + if ([albumPickerVc isKindOfClass:[TZAlbumPickerController class]]) { + [albumPickerVc configTableView]; + } + } +} + +- (void)pushPhotoPickerVc { + _didPushPhotoPickerVc = NO; + // 1.6.8 ������������������push���������������������������_pushPhotoPickerVc���NO,������push + if (!_didPushPhotoPickerVc && _pushPhotoPickerVc) { + TZPhotoPickerController *photoPickerVc = [[TZPhotoPickerController alloc] init]; + photoPickerVc.isFirstAppear = YES; + photoPickerVc.columnNumber = self.columnNumber; + [[TZImageManager manager] getCameraRollAlbum:self.allowPickingVideo allowPickingImage:self.allowPickingImage needFetchAssets:NO completion:^(TZAlbumModel *model) { + photoPickerVc.model = model; + [self pushViewController:photoPickerVc animated:YES]; + self->_didPushPhotoPickerVc = YES; + }]; + } +} + +- (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; + } +} + +- (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]; + } + alertView = nil; +} + +- (void)showProgressHUD { + if (!_progressHUD) { + _progressHUD = [UIButton buttonWithType:UIButtonTypeCustom]; + [_progressHUD setBackgroundColor:[UIColor clearColor]]; + + _HUDContainer = [[UIView alloc] init]; + _HUDContainer.layer.cornerRadius = 8; + _HUDContainer.clipsToBounds = YES; + _HUDContainer.backgroundColor = [UIColor darkGrayColor]; + _HUDContainer.alpha = 0.7; + + _HUDIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; + + _HUDLabel = [[UILabel alloc] init]; + _HUDLabel.textAlignment = NSTextAlignmentCenter; + _HUDLabel.text = self.processHintStr; + _HUDLabel.font = [UIFont systemFontOfSize:15]; + _HUDLabel.textColor = [UIColor whiteColor]; + + [_HUDContainer addSubview:_HUDLabel]; + [_HUDContainer addSubview:_HUDIndicatorView]; + [_progressHUD addSubview:_HUDContainer]; + } + [_HUDIndicatorView startAnimating]; + [[UIApplication sharedApplication].keyWindow addSubview:_progressHUD]; + + // if over time, dismiss HUD automatic + __weak typeof(self) weakSelf = self; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.timeout * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + __strong typeof(weakSelf) strongSelf = weakSelf; + [strongSelf hideProgressHUD]; + }); +} + +- (void)hideProgressHUD { + if (_progressHUD) { + [_HUDIndicatorView stopAnimating]; + [_progressHUD removeFromSuperview]; + } +} + +- (void)setMaxImagesCount:(NSInteger)maxImagesCount { + _maxImagesCount = maxImagesCount; + if (maxImagesCount > 1) { + _showSelectBtn = YES; + _allowCrop = NO; + } +} + +- (void)setShowSelectBtn:(BOOL)showSelectBtn { + _showSelectBtn = showSelectBtn; + // ������������������������������showSelectBtn���NO + if (!showSelectBtn && _maxImagesCount > 1) { + _showSelectBtn = YES; + } +} + +- (void)setAllowCrop:(BOOL)allowCrop { + _allowCrop = _maxImagesCount > 1 ? NO : allowCrop; + if (allowCrop) { // ������������������������������������������GIF + self.allowPickingOriginalPhoto = NO; + self.allowPickingGif = NO; + } +} + +- (void)setCircleCropRadius:(NSInteger)circleCropRadius { + _circleCropRadius = circleCropRadius; + self.cropRect = CGRectMake(self.view.tz_width / 2 - circleCropRadius, self.view.tz_height / 2 - _circleCropRadius, _circleCropRadius * 2, _circleCropRadius * 2); +} + +- (void)setCropRect:(CGRect)cropRect { + _cropRect = cropRect; + _cropRectPortrait = cropRect; + CGFloat widthHeight = cropRect.size.width; + _cropRectLandscape = CGRectMake((self.view.tz_height - widthHeight) / 2, cropRect.origin.x, widthHeight, widthHeight); +} + +- (void)setTimeout:(NSInteger)timeout { + _timeout = timeout; + if (timeout < 5) { + _timeout = 5; + } else if (_timeout > 60) { + _timeout = 60; + } +} + +- (void)setPickerDelegate:(id<TZImagePickerControllerDelegate>)pickerDelegate { + _pickerDelegate = pickerDelegate; + [TZImageManager manager].pickerDelegate = pickerDelegate; +} + +- (void)setColumnNumber:(NSInteger)columnNumber { + _columnNumber = columnNumber; + if (columnNumber <= 2) { + _columnNumber = 2; + } else if (columnNumber >= 6) { + _columnNumber = 6; + } + + TZAlbumPickerController *albumPickerVc = [self.childViewControllers firstObject]; + albumPickerVc.columnNumber = _columnNumber; + [TZImageManager manager].columnNumber = _columnNumber; +} + +- (void)setMinPhotoWidthSelectable:(NSInteger)minPhotoWidthSelectable { + _minPhotoWidthSelectable = minPhotoWidthSelectable; + [TZImageManager manager].minPhotoWidthSelectable = minPhotoWidthSelectable; +} + +- (void)setMinPhotoHeightSelectable:(NSInteger)minPhotoHeightSelectable { + _minPhotoHeightSelectable = minPhotoHeightSelectable; + [TZImageManager manager].minPhotoHeightSelectable = minPhotoHeightSelectable; +} + +- (void)setHideWhenCanNotSelect:(BOOL)hideWhenCanNotSelect { + _hideWhenCanNotSelect = hideWhenCanNotSelect; + [TZImageManager manager].hideWhenCanNotSelect = hideWhenCanNotSelect; +} + +- (void)setPhotoPreviewMaxWidth:(CGFloat)photoPreviewMaxWidth { + _photoPreviewMaxWidth = photoPreviewMaxWidth; + if (photoPreviewMaxWidth > 800) { + _photoPreviewMaxWidth = 800; + } else if (photoPreviewMaxWidth < 500) { + _photoPreviewMaxWidth = 500; + } + [TZImageManager manager].photoPreviewMaxWidth = _photoPreviewMaxWidth; +} + +- (void)setPhotoWidth:(CGFloat)photoWidth { + _photoWidth = photoWidth; + [TZImageManager manager].photoWidth = photoWidth; +} + +- (void)setSelectedAssets:(NSMutableArray *)selectedAssets { + _selectedAssets = selectedAssets; + _selectedModels = [NSMutableArray array]; + _selectedAssetIds = [NSMutableArray array]; + for (id asset in selectedAssets) { + TZAssetModel *model = [TZAssetModel modelWithAsset:asset type:[[TZImageManager manager] getAssetType:asset]]; + model.isSelected = YES; + [self addSelectedModel:model]; + } +} + +- (void)setAllowPickingImage:(BOOL)allowPickingImage { + _allowPickingImage = allowPickingImage; + [TZImagePickerConfig sharedInstance].allowPickingImage = allowPickingImage; + if (!allowPickingImage) { + _allowTakePicture = NO; + } +} + +- (void)setAllowPickingVideo:(BOOL)allowPickingVideo { + _allowPickingVideo = allowPickingVideo; + [TZImagePickerConfig sharedInstance].allowPickingVideo = allowPickingVideo; + if (!allowPickingVideo) { + _allowTakeVideo = NO; + } +} + +- (void)setPreferredLanguage:(NSString *)preferredLanguage { + _preferredLanguage = preferredLanguage; + [TZImagePickerConfig sharedInstance].preferredLanguage = preferredLanguage; + [self configDefaultBtnTitle]; +} + +- (void)setLanguageBundle:(NSBundle *)languageBundle { + _languageBundle = languageBundle; + [TZImagePickerConfig sharedInstance].languageBundle = languageBundle; + [self configDefaultBtnTitle]; +} + +- (void)setSortAscendingByModificationDate:(BOOL)sortAscendingByModificationDate { + _sortAscendingByModificationDate = sortAscendingByModificationDate; + [TZImageManager manager].sortAscendingByModificationDate = sortAscendingByModificationDate; +} + +- (void)settingBtnClick { + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; +} + +- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { + if (iOS7Later) { + viewController.automaticallyAdjustsScrollViewInsets = NO; + } + [super pushViewController:viewController animated:animated]; +} + +- (void)dealloc { + // NSLog(@"%@ dealloc",NSStringFromClass(self.class)); +} + +- (void)addSelectedModel:(TZAssetModel *)model { + [_selectedModels addObject:model]; + NSString *assetId = [[TZImageManager manager] getAssetIdentifier:model.asset]; + [_selectedAssetIds addObject:assetId]; +} + +- (void)removeSelectedModel:(TZAssetModel *)model { + [_selectedModels removeObject:model]; + NSString *assetId = [[TZImageManager manager] getAssetIdentifier:model.asset]; + [_selectedAssetIds removeObject:assetId]; +} + +- (UIImage *)createImageWithColor:(UIColor *)color size:(CGSize)size radius:(CGFloat)radius { + if (!color) { + color = self.iconThemeColor; + } + CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height); + UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSetFillColorWithColor(context, [color CGColor]); + UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius]; + CGContextAddPath(context, path.CGPath); + CGContextFillPath(context); + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return image; +} + +#pragma mark - UIContentContainer + +- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { + [self willInterfaceOrientionChange]; + if (size.width > size.height) { + _cropRect = _cropRectLandscape; + } else { + _cropRect = _cropRectPortrait; + } +} + +- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { + [self willInterfaceOrientionChange]; + if (toInterfaceOrientation >= 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 { + [super viewDidLayoutSubviews]; + + _HUDContainer.frame = CGRectMake((self.view.tz_width - 120) / 2, (self.view.tz_height - 90) / 2, 120, 90); + _HUDIndicatorView.frame = CGRectMake(45, 15, 30, 30); + _HUDLabel.frame = CGRectMake(0,40, 120, 50); +} + +#pragma mark - Public + +- (void)cancelButtonClick { + if (self.autoDismiss) { + [self dismissViewControllerAnimated:YES completion:^{ + [self callDelegateMethod]; + }]; + } else { + [self callDelegateMethod]; + } +} + +- (void)callDelegateMethod { + if ([self.pickerDelegate respondsToSelector:@selector(tz_imagePickerControllerDidCancel:)]) { + [self.pickerDelegate tz_imagePickerControllerDidCancel:self]; + } + if (self.imagePickerControllerDidCancelHandle) { + self.imagePickerControllerDidCancelHandle(); + } +} + +@end + + +@interface TZAlbumPickerController ()<UITableViewDataSource,UITableViewDelegate> { + UITableView *_tableView; +} +@property (nonatomic, strong) NSMutableArray *albumArr; +@end + +@implementation TZAlbumPickerController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.isFirstAppear = YES; + self.view.backgroundColor = [UIColor whiteColor]; + + TZImagePickerController *imagePickerVc = (TZImagePickerController *)self.navigationController; + self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:imagePickerVc.cancelBtnTitleStr style:UIBarButtonItemStylePlain target:imagePickerVc action:@selector(cancelButtonClick)]; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + TZImagePickerController *imagePickerVc = (TZImagePickerController *)self.navigationController; + [imagePickerVc hideProgressHUD]; + if (imagePickerVc.allowPickingImage) { + self.navigationItem.title = [NSBundle tz_localizedStringForKey:@"Photos"]; + } else if (imagePickerVc.allowPickingVideo) { + self.navigationItem.title = [NSBundle tz_localizedStringForKey:@"Videos"]; + } + + if (self.isFirstAppear && !imagePickerVc.navLeftBarButtonSettingBlock) { + self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:[NSBundle tz_localizedStringForKey:@"Back"] style:UIBarButtonItemStylePlain target:nil action:nil]; + } + + [self configTableView]; +} + +- (void)configTableView { + if (![[TZImageManager manager] authorizationStatusAuthorized]) { + return; + } + + if (self.isFirstAppear) { + TZImagePickerController *imagePickerVc = (TZImagePickerController *)self.navigationController; + [imagePickerVc showProgressHUD]; + } + + dispatch_async(dispatch_get_global_queue(0, 0), ^{ + TZImagePickerController *imagePickerVc = (TZImagePickerController *)self.navigationController; + [[TZImageManager manager] getAllAlbums:imagePickerVc.allowPickingVideo allowPickingImage:imagePickerVc.allowPickingImage needFetchAssets:!self.isFirstAppear completion:^(NSArray<TZAlbumModel *> *models) { + dispatch_async(dispatch_get_main_queue(), ^{ + self->_albumArr = [NSMutableArray arrayWithArray:models]; + for (TZAlbumModel *albumModel in self->_albumArr) { + albumModel.selectedModels = imagePickerVc.selectedModels; + } + [imagePickerVc hideProgressHUD]; + + if (self.isFirstAppear) { + self.isFirstAppear = NO; + [self configTableView]; + } + + if (!self->_tableView) { + self->_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; + self->_tableView.rowHeight = 70; + self->_tableView.tableFooterView = [[UIView alloc] init]; + self->_tableView.dataSource = self; + self->_tableView.delegate = self; + [self->_tableView registerClass:[TZAlbumCell class] forCellReuseIdentifier:@"TZAlbumCell"]; + [self.view addSubview:self->_tableView]; + } else { + [self->_tableView reloadData]; + } + }); + }]; + }); +} + +- (void)dealloc { + // NSLog(@"%@ dealloc",NSStringFromClass(self.class)); +} + +#pragma mark - Layout + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + + CGFloat top = 0; + CGFloat tableViewHeight = 0; + CGFloat naviBarHeight = self.navigationController.navigationBar.tz_height; + BOOL isStatusBarHidden = [UIApplication sharedApplication].isStatusBarHidden; + if (self.navigationController.navigationBar.isTranslucent) { + top = naviBarHeight; + if (iOS7Later && !isStatusBarHidden) top += [TZCommonTools tz_statusBarHeight]; + tableViewHeight = self.view.tz_height - top; + } else { + tableViewHeight = self.view.tz_height; + } + _tableView.frame = CGRectMake(0, top, self.view.tz_width, tableViewHeight); +} + +#pragma mark - UITableViewDataSource && Delegate + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return _albumArr.count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + TZAlbumCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TZAlbumCell"]; + TZImagePickerController *imagePickerVc = (TZImagePickerController *)self.navigationController; + cell.albumCellDidLayoutSubviewsBlock = imagePickerVc.albumCellDidLayoutSubviewsBlock; + cell.albumCellDidSetModelBlock = imagePickerVc.albumCellDidSetModelBlock; + cell.selectedCountButton.backgroundColor = imagePickerVc.iconThemeColor; + cell.model = _albumArr[indexPath.row]; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + TZPhotoPickerController *photoPickerVc = [[TZPhotoPickerController alloc] init]; + photoPickerVc.columnNumber = self.columnNumber; + TZAlbumModel *model = _albumArr[indexPath.row]; + photoPickerVc.model = model; + [self.navigationController pushViewController:photoPickerVc animated:YES]; + [tableView deselectRowAtIndexPath:indexPath animated:NO]; +} + +#pragma clang diagnostic pop + +@end + + +@implementation UIImage (MyBundle) + ++ (UIImage *)imageNamedFromMyBundle:(NSString *)name { + NSBundle *imageBundle = [NSBundle tz_imagePickerBundle]; + name = [name stringByAppendingString:@"@2x"]; + NSString *imagePath = [imageBundle pathForResource:name ofType:@"png"]; + UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; + if (!image) { + // ������������������������������������������ + name = [name stringByReplacingOccurrencesOfString:@"@2x" withString:@""]; + image = [UIImage imageNamed:name]; + } + return image; +} + +@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 { + struct utsname systemInfo; + uname(&systemInfo); + NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding]; + if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) { + // ������������������������������������������ + return (CGSizeEqualToSize([UIScreen mainScreen].bounds.size, CGSizeMake(375, 812)) || + CGSizeEqualToSize([UIScreen mainScreen].bounds.size, CGSizeMake(812, 375))); + } + // iPhone10,6���������iPhoneX ������hegelsu���������https://github.com/banchichen/TZImagePickerController/issues/635 + BOOL isIPhoneX = [platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"]; + return isIPhoneX; +} + ++ (CGFloat)tz_statusBarHeight { + return [self tz_isIPhoneX] ? 44 : 20; +} + +// ������Info.plist������������ ++ (NSDictionary *)tz_getInfoDictionary { + NSDictionary *infoDict = [NSBundle mainBundle].localizedInfoDictionary; + if (!infoDict || !infoDict.count) { + infoDict = [NSBundle mainBundle].infoDictionary; + } + if (!infoDict || !infoDict.count) { + NSString *path = [[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"]; + infoDict = [NSDictionary dictionaryWithContentsOfFile:path]; + } + return infoDict ? infoDict : @{}; +} +@end + + +@implementation TZImagePickerConfig + ++ (instancetype)sharedInstance { + static dispatch_once_t onceToken; + static TZImagePickerConfig *config = nil; + dispatch_once(&onceToken, ^{ + if (config == nil) { + config = [[TZImagePickerConfig alloc] init]; + config.preferredLanguage = nil; + config.gifPreviewMaxImagesCount = 200; + } + }); + return config; +} + +- (void)setPreferredLanguage:(NSString *)preferredLanguage { + _preferredLanguage = preferredLanguage; + + if (!preferredLanguage || !preferredLanguage.length) { + preferredLanguage = [NSLocale preferredLanguages].firstObject; + } + if ([preferredLanguage rangeOfString:@"zh-Hans"].location != NSNotFound) { + preferredLanguage = @"zh-Hans"; + } else if ([preferredLanguage rangeOfString:@"zh-Hant"].location != NSNotFound) { + preferredLanguage = @"zh-Hant"; + } else if ([preferredLanguage rangeOfString:@"vi"].location != NSNotFound) { + preferredLanguage = @"vi"; + } else { + preferredLanguage = @"en"; + } + _languageBundle = [NSBundle bundleWithPath:[[NSBundle tz_imagePickerBundle] pathForResource:preferredLanguage ofType:@"lproj"]]; +} + +@end -- Gitblit v1.8.0