//
|
// TZPhotoPreviewController.m
|
// TZImagePickerController
|
//
|
// Created by 谭真 on 15/12/24.
|
// Copyright © 2015年 谭真. All rights reserved.
|
//
|
|
#import "TZPhotoPreviewController.h"
|
#import "TZPhotoPreviewCell.h"
|
#import "TZAssetModel.h"
|
#import "UIView+Layout.h"
|
#import "TZImagePickerController.h"
|
#import "TZImageManager.h"
|
#import "TZImageCropManager.h"
|
|
@interface TZPhotoPreviewController ()<UICollectionViewDataSource,UICollectionViewDelegate,UIScrollViewDelegate> {
|
UICollectionView *_collectionView;
|
UICollectionViewFlowLayout *_layout;
|
NSArray *_photosTemp;
|
NSArray *_assetsTemp;
|
|
UIView *_naviBar;
|
UIButton *_backButton;
|
UIButton *_selectButton;
|
UILabel *_indexLabel;
|
|
UIView *_toolBar;
|
UIButton *_doneButton;
|
UIImageView *_numberImageView;
|
UILabel *_numberLabel;
|
UIButton *_originalPhotoButton;
|
UILabel *_originalPhotoLabel;
|
|
CGFloat _offsetItemCount;
|
}
|
@property (nonatomic, assign) BOOL isHideNaviBar;
|
@property (nonatomic, strong) UIView *cropBgView;
|
@property (nonatomic, strong) UIView *cropView;
|
|
@property (nonatomic, assign) double progress;
|
@property (strong, nonatomic) id alertView;
|
@end
|
|
@implementation TZPhotoPreviewController
|
|
- (void)viewDidLoad {
|
[super viewDidLoad];
|
[TZImageManager manager].shouldFixOrientation = YES;
|
__weak typeof(self) weakSelf = self;
|
TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)weakSelf.navigationController;
|
if (!self.models.count) {
|
self.models = [NSMutableArray arrayWithArray:_tzImagePickerVc.selectedModels];
|
_assetsTemp = [NSMutableArray arrayWithArray:_tzImagePickerVc.selectedAssets];
|
}
|
[self configCollectionView];
|
[self configCustomNaviBar];
|
[self configBottomToolBar];
|
self.view.clipsToBounds = YES;
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
|
}
|
|
- (void)setPhotos:(NSMutableArray *)photos {
|
_photos = photos;
|
_photosTemp = [NSArray arrayWithArray:photos];
|
}
|
|
- (void)viewWillAppear:(BOOL)animated {
|
[super viewWillAppear:animated];
|
[self.navigationController setNavigationBarHidden:YES animated:YES];
|
if (iOS7Later) [UIApplication sharedApplication].statusBarHidden = YES;
|
if (_currentIndex) [_collectionView setContentOffset:CGPointMake((self.view.tz_width + 20) * _currentIndex, 0) animated:NO];
|
[self refreshNaviBarAndBottomBarState];
|
}
|
|
- (void)viewWillDisappear:(BOOL)animated {
|
[super viewWillDisappear:animated];
|
[self.navigationController setNavigationBarHidden:NO animated:YES];
|
TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
if (tzImagePickerVc.needShowStatusBar && iOS7Later) {
|
[UIApplication sharedApplication].statusBarHidden = NO;
|
}
|
[TZImageManager manager].shouldFixOrientation = NO;
|
}
|
|
- (BOOL)prefersStatusBarHidden {
|
return YES;
|
}
|
|
- (void)configCustomNaviBar {
|
TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
|
_naviBar = [[UIView alloc] initWithFrame:CGRectZero];
|
_naviBar.backgroundColor = [UIColor colorWithRed:(34/255.0) green:(34/255.0) blue:(34/255.0) alpha:0.7];
|
|
_backButton = [[UIButton alloc] initWithFrame:CGRectZero];
|
[_backButton setImage:[UIImage imageNamedFromMyBundle:@"navi_back"] forState:UIControlStateNormal];
|
[_backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
|
[_backButton addTarget:self action:@selector(backButtonClick) forControlEvents:UIControlEventTouchUpInside];
|
|
_selectButton = [[UIButton alloc] initWithFrame:CGRectZero];
|
[_selectButton setImage:tzImagePickerVc.photoDefImage forState:UIControlStateNormal];
|
[_selectButton setImage:tzImagePickerVc.photoSelImage forState:UIControlStateSelected];
|
_selectButton.imageView.clipsToBounds = YES;
|
_selectButton.imageEdgeInsets = UIEdgeInsetsMake(10, 0, 10, 0);
|
_selectButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
|
[_selectButton addTarget:self action:@selector(select:) forControlEvents:UIControlEventTouchUpInside];
|
_selectButton.hidden = !tzImagePickerVc.showSelectBtn;
|
|
_indexLabel = [[UILabel alloc] init];
|
_indexLabel.font = [UIFont systemFontOfSize:14];
|
_indexLabel.textColor = [UIColor whiteColor];
|
_indexLabel.textAlignment = NSTextAlignmentCenter;
|
|
[_naviBar addSubview:_selectButton];
|
[_naviBar addSubview:_indexLabel];
|
[_naviBar addSubview:_backButton];
|
[self.view addSubview:_naviBar];
|
}
|
|
- (void)configBottomToolBar {
|
_toolBar = [[UIView alloc] initWithFrame:CGRectZero];
|
static CGFloat rgb = 34 / 255.0;
|
_toolBar.backgroundColor = [UIColor colorWithRed:rgb green:rgb blue:rgb alpha:0.7];
|
|
TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
if (_tzImagePickerVc.allowPickingOriginalPhoto) {
|
_originalPhotoButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
_originalPhotoButton.imageEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
|
_originalPhotoButton.backgroundColor = [UIColor clearColor];
|
[_originalPhotoButton addTarget:self action:@selector(originalPhotoButtonClick) forControlEvents:UIControlEventTouchUpInside];
|
_originalPhotoButton.titleLabel.font = [UIFont systemFontOfSize:13];
|
[_originalPhotoButton setTitle:_tzImagePickerVc.fullImageBtnTitleStr forState:UIControlStateNormal];
|
[_originalPhotoButton setTitle:_tzImagePickerVc.fullImageBtnTitleStr forState:UIControlStateSelected];
|
[_originalPhotoButton setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal];
|
[_originalPhotoButton setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
|
[_originalPhotoButton setImage:_tzImagePickerVc.photoPreviewOriginDefImage forState:UIControlStateNormal];
|
[_originalPhotoButton setImage:_tzImagePickerVc.photoOriginSelImage forState:UIControlStateSelected];
|
|
_originalPhotoLabel = [[UILabel alloc] init];
|
_originalPhotoLabel.textAlignment = NSTextAlignmentLeft;
|
_originalPhotoLabel.font = [UIFont systemFontOfSize:13];
|
_originalPhotoLabel.textColor = [UIColor whiteColor];
|
_originalPhotoLabel.backgroundColor = [UIColor clearColor];
|
if (_isSelectOriginalPhoto) [self showPhotoBytes];
|
}
|
|
_doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
_doneButton.titleLabel.font = [UIFont systemFontOfSize:16];
|
[_doneButton addTarget:self action:@selector(doneButtonClick) forControlEvents:UIControlEventTouchUpInside];
|
[_doneButton setTitle:_tzImagePickerVc.doneBtnTitleStr forState:UIControlStateNormal];
|
[_doneButton setTitleColor:_tzImagePickerVc.oKButtonTitleColorNormal forState:UIControlStateNormal];
|
|
_numberImageView = [[UIImageView alloc] initWithImage:_tzImagePickerVc.photoNumberIconImage];
|
_numberImageView.backgroundColor = [UIColor clearColor];
|
_numberImageView.clipsToBounds = YES;
|
_numberImageView.contentMode = UIViewContentModeScaleAspectFit;
|
_numberImageView.hidden = _tzImagePickerVc.selectedModels.count <= 0;
|
|
_numberLabel = [[UILabel alloc] init];
|
_numberLabel.font = [UIFont systemFontOfSize:15];
|
_numberLabel.textColor = [UIColor whiteColor];
|
_numberLabel.textAlignment = NSTextAlignmentCenter;
|
_numberLabel.text = [NSString stringWithFormat:@"%zd",_tzImagePickerVc.selectedModels.count];
|
_numberLabel.hidden = _tzImagePickerVc.selectedModels.count <= 0;
|
_numberLabel.backgroundColor = [UIColor clearColor];
|
|
[_originalPhotoButton addSubview:_originalPhotoLabel];
|
[_toolBar addSubview:_doneButton];
|
[_toolBar addSubview:_originalPhotoButton];
|
[_toolBar addSubview:_numberImageView];
|
[_toolBar addSubview:_numberLabel];
|
[self.view addSubview:_toolBar];
|
|
if (_tzImagePickerVc.photoPreviewPageUIConfigBlock) {
|
_tzImagePickerVc.photoPreviewPageUIConfigBlock(_collectionView, _naviBar, _backButton, _selectButton, _indexLabel, _toolBar, _originalPhotoButton, _originalPhotoLabel, _doneButton, _numberImageView, _numberLabel);
|
}
|
}
|
|
- (void)configCollectionView {
|
_layout = [[UICollectionViewFlowLayout alloc] init];
|
_layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
|
_collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:_layout];
|
_collectionView.backgroundColor = [UIColor blackColor];
|
_collectionView.dataSource = self;
|
_collectionView.delegate = self;
|
_collectionView.pagingEnabled = YES;
|
_collectionView.scrollsToTop = NO;
|
_collectionView.showsHorizontalScrollIndicator = NO;
|
_collectionView.contentOffset = CGPointMake(0, 0);
|
_collectionView.contentSize = CGSizeMake(self.models.count * (self.view.tz_width + 20), 0);
|
[self.view addSubview:_collectionView];
|
[_collectionView registerClass:[TZPhotoPreviewCell class] forCellWithReuseIdentifier:@"TZPhotoPreviewCell"];
|
[_collectionView registerClass:[TZVideoPreviewCell class] forCellWithReuseIdentifier:@"TZVideoPreviewCell"];
|
[_collectionView registerClass:[TZGifPreviewCell class] forCellWithReuseIdentifier:@"TZGifPreviewCell"];
|
}
|
|
- (void)configCropView {
|
TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
if (_tzImagePickerVc.maxImagesCount <= 1 && _tzImagePickerVc.allowCrop) {
|
[_cropView removeFromSuperview];
|
[_cropBgView removeFromSuperview];
|
|
_cropBgView = [UIView new];
|
_cropBgView.userInteractionEnabled = NO;
|
_cropBgView.frame = self.view.bounds;
|
_cropBgView.backgroundColor = [UIColor clearColor];
|
[self.view addSubview:_cropBgView];
|
[TZImageCropManager overlayClippingWithView:_cropBgView cropRect:_tzImagePickerVc.cropRect containerView:self.view needCircleCrop:_tzImagePickerVc.needCircleCrop];
|
|
_cropView = [UIView new];
|
_cropView.userInteractionEnabled = NO;
|
_cropView.frame = _tzImagePickerVc.cropRect;
|
_cropView.backgroundColor = [UIColor clearColor];
|
_cropView.layer.borderColor = [UIColor whiteColor].CGColor;
|
_cropView.layer.borderWidth = 1.0;
|
if (_tzImagePickerVc.needCircleCrop) {
|
_cropView.layer.cornerRadius = _tzImagePickerVc.cropRect.size.width / 2;
|
_cropView.clipsToBounds = YES;
|
}
|
[self.view addSubview:_cropView];
|
if (_tzImagePickerVc.cropViewSettingBlock) {
|
_tzImagePickerVc.cropViewSettingBlock(_cropView);
|
}
|
|
[self.view bringSubviewToFront:_naviBar];
|
[self.view bringSubviewToFront:_toolBar];
|
}
|
}
|
|
#pragma mark - Layout
|
|
- (void)viewDidLayoutSubviews {
|
[super viewDidLayoutSubviews];
|
TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
|
CGFloat statusBarHeight = [TZCommonTools tz_statusBarHeight];
|
CGFloat statusBarHeightInterval = statusBarHeight - 20;
|
CGFloat naviBarHeight = statusBarHeight + _tzImagePickerVc.navigationBar.tz_height;
|
_naviBar.frame = CGRectMake(0, 0, self.view.tz_width, naviBarHeight);
|
_backButton.frame = CGRectMake(10, 10 + statusBarHeightInterval, 44, 44);
|
_selectButton.frame = CGRectMake(self.view.tz_width - 56, 10 + statusBarHeightInterval, 44, 44);
|
_indexLabel.frame = _selectButton.frame;
|
|
_layout.itemSize = CGSizeMake(self.view.tz_width + 20, self.view.tz_height);
|
_layout.minimumInteritemSpacing = 0;
|
_layout.minimumLineSpacing = 0;
|
_collectionView.frame = CGRectMake(-10, 0, self.view.tz_width + 20, self.view.tz_height);
|
[_collectionView setCollectionViewLayout:_layout];
|
if (_offsetItemCount > 0) {
|
CGFloat offsetX = _offsetItemCount * _layout.itemSize.width;
|
[_collectionView setContentOffset:CGPointMake(offsetX, 0)];
|
}
|
if (_tzImagePickerVc.allowCrop) {
|
[_collectionView reloadData];
|
}
|
|
CGFloat toolBarHeight = [TZCommonTools tz_isIPhoneX] ? 44 + (83 - 49) : 44;
|
CGFloat toolBarTop = self.view.tz_height - toolBarHeight;
|
_toolBar.frame = CGRectMake(0, toolBarTop, self.view.tz_width, toolBarHeight);
|
if (_tzImagePickerVc.allowPickingOriginalPhoto) {
|
CGFloat fullImageWidth = [_tzImagePickerVc.fullImageBtnTitleStr tz_calculateSizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13]} maxSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)].width;
|
_originalPhotoButton.frame = CGRectMake(0, 0, fullImageWidth + 56, 44);
|
_originalPhotoLabel.frame = CGRectMake(fullImageWidth + 42, 0, 80, 44);
|
}
|
[_doneButton sizeToFit];
|
_doneButton.frame = CGRectMake(self.view.tz_width - _doneButton.tz_width - 12, 0, _doneButton.tz_width, 44);
|
_numberImageView.frame = CGRectMake(_doneButton.tz_left - 24 - 5, 10, 24, 24);
|
_numberLabel.frame = _numberImageView.frame;
|
|
[self configCropView];
|
|
if (_tzImagePickerVc.photoPreviewPageDidLayoutSubviewsBlock) {
|
_tzImagePickerVc.photoPreviewPageDidLayoutSubviewsBlock(_collectionView, _naviBar, _backButton, _selectButton, _indexLabel, _toolBar, _originalPhotoButton, _originalPhotoLabel, _doneButton, _numberImageView, _numberLabel);
|
}
|
}
|
|
#pragma mark - Notification
|
|
- (void)didChangeStatusBarOrientationNotification:(NSNotification *)noti {
|
_offsetItemCount = _collectionView.contentOffset.x / _layout.itemSize.width;
|
}
|
|
#pragma mark - Click Event
|
|
- (void)select:(UIButton *)selectButton {
|
TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
TZAssetModel *model = _models[_currentIndex];
|
if (!selectButton.isSelected) {
|
// 1. select:check if over the maxImagesCount / 选择照片,检查是否超过了最大个数的限制
|
if (_tzImagePickerVc.selectedModels.count >= _tzImagePickerVc.maxImagesCount) {
|
NSString *title = [NSString stringWithFormat:[NSBundle tz_localizedStringForKey:@"Select a maximum of %zd photos"], _tzImagePickerVc.maxImagesCount];
|
[_tzImagePickerVc showAlertWithTitle:title];
|
return;
|
// 2. if not over the maxImagesCount / 如果没有超过最大个数限制
|
} else {
|
[_tzImagePickerVc addSelectedModel:model];
|
if (self.photos) {
|
[_tzImagePickerVc.selectedAssets addObject:_assetsTemp[_currentIndex]];
|
[self.photos addObject:_photosTemp[_currentIndex]];
|
}
|
if (model.type == TZAssetModelMediaTypeVideo && !_tzImagePickerVc.allowPickingMultipleVideo) {
|
[_tzImagePickerVc showAlertWithTitle:[NSBundle tz_localizedStringForKey:@"Select the video when in multi state, we will handle the video as a photo"]];
|
}
|
}
|
} else {
|
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]]) {
|
// 1.6.7版本更新:防止有多个一样的model,一次性被移除了
|
NSArray *selectedModelsTmp = [NSArray arrayWithArray:_tzImagePickerVc.selectedModels];
|
for (NSInteger i = 0; i < selectedModelsTmp.count; i++) {
|
TZAssetModel *model = selectedModelsTmp[i];
|
if ([model isEqual:model_item]) {
|
[_tzImagePickerVc removeSelectedModel:model];
|
// [_tzImagePickerVc.selectedModels removeObjectAtIndex:i];
|
break;
|
}
|
}
|
if (self.photos) {
|
// 1.6.7版本更新:防止有多个一样的asset,一次性被移除了
|
NSArray *selectedAssetsTmp = [NSArray arrayWithArray:_tzImagePickerVc.selectedAssets];
|
for (NSInteger i = 0; i < selectedAssetsTmp.count; i++) {
|
id asset = selectedAssetsTmp[i];
|
if ([asset isEqual:_assetsTemp[_currentIndex]]) {
|
[_tzImagePickerVc.selectedAssets removeObjectAtIndex:i];
|
break;
|
}
|
}
|
// [_tzImagePickerVc.selectedAssets removeObject:_assetsTemp[_currentIndex]];
|
[self.photos removeObject:_photosTemp[_currentIndex]];
|
}
|
break;
|
}
|
}
|
}
|
model.isSelected = !selectButton.isSelected;
|
[self refreshNaviBarAndBottomBarState];
|
if (model.isSelected) {
|
[UIView showOscillatoryAnimationWithLayer:selectButton.imageView.layer type:TZOscillatoryAnimationToBigger];
|
}
|
[UIView showOscillatoryAnimationWithLayer:_numberImageView.layer type:TZOscillatoryAnimationToSmaller];
|
}
|
|
- (void)backButtonClick {
|
if (self.navigationController.childViewControllers.count < 2) {
|
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
|
return;
|
}
|
[self.navigationController popViewControllerAnimated:YES];
|
if (self.backButtonClickBlock) {
|
self.backButtonClickBlock(_isSelectOriginalPhoto);
|
}
|
}
|
|
- (void)doneButtonClick {
|
TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
// 如果图片正在从iCloud同步中,提醒用户
|
if (_progress > 0 && _progress < 1 && (_selectButton.isSelected || !_tzImagePickerVc.selectedModels.count )) {
|
_alertView = [_tzImagePickerVc showAlertWithTitle:[NSBundle tz_localizedStringForKey:@"Synchronizing photos from iCloud"]];
|
return;
|
}
|
|
// 如果没有选中过照片 点击确定时选中当前预览的照片
|
if (_tzImagePickerVc.selectedModels.count == 0 && _tzImagePickerVc.minImagesCount <= 0) {
|
TZAssetModel *model = _models[_currentIndex];
|
[_tzImagePickerVc addSelectedModel:model];
|
}
|
if (_tzImagePickerVc.allowCrop) { // 裁剪状态
|
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:_currentIndex inSection:0];
|
TZPhotoPreviewCell *cell = (TZPhotoPreviewCell *)[_collectionView cellForItemAtIndexPath:indexPath];
|
UIImage *cropedImage = [TZImageCropManager cropImageView:cell.previewView.imageView toRect:_tzImagePickerVc.cropRect zoomScale:cell.previewView.scrollView.zoomScale containerView:self.view];
|
if (_tzImagePickerVc.needCircleCrop) {
|
cropedImage = [TZImageCropManager circularClipImage:cropedImage];
|
}
|
if (self.doneButtonClickBlockCropMode) {
|
TZAssetModel *model = _models[_currentIndex];
|
self.doneButtonClickBlockCropMode(cropedImage,model.asset);
|
}
|
} else if (self.doneButtonClickBlock) { // 非裁剪状态
|
self.doneButtonClickBlock(_isSelectOriginalPhoto);
|
}
|
if (self.doneButtonClickBlockWithPreviewType) {
|
self.doneButtonClickBlockWithPreviewType(self.photos,_tzImagePickerVc.selectedAssets,self.isSelectOriginalPhoto);
|
}
|
}
|
|
- (void)originalPhotoButtonClick {
|
_originalPhotoButton.selected = !_originalPhotoButton.isSelected;
|
_isSelectOriginalPhoto = _originalPhotoButton.isSelected;
|
_originalPhotoLabel.hidden = !_originalPhotoButton.isSelected;
|
if (_isSelectOriginalPhoto) {
|
[self showPhotoBytes];
|
if (!_selectButton.isSelected) {
|
// 如果当前已选择照片张数 < 最大可选张数 && 最大可选张数大于1,就选中该张图
|
TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
if (_tzImagePickerVc.selectedModels.count < _tzImagePickerVc.maxImagesCount && _tzImagePickerVc.showSelectBtn) {
|
[self select:_selectButton];
|
}
|
}
|
}
|
}
|
|
- (void)didTapPreviewCell {
|
self.isHideNaviBar = !self.isHideNaviBar;
|
_naviBar.hidden = self.isHideNaviBar;
|
_toolBar.hidden = self.isHideNaviBar;
|
}
|
|
#pragma mark - UIScrollViewDelegate
|
|
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
|
CGFloat offSetWidth = scrollView.contentOffset.x;
|
offSetWidth = offSetWidth + ((self.view.tz_width + 20) * 0.5);
|
|
NSInteger currentIndex = offSetWidth / (self.view.tz_width + 20);
|
|
if (currentIndex < _models.count && _currentIndex != currentIndex) {
|
_currentIndex = currentIndex;
|
[self refreshNaviBarAndBottomBarState];
|
}
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:@"photoPreviewCollectionViewDidScroll" object:nil];
|
}
|
|
#pragma mark - UICollectionViewDataSource && Delegate
|
|
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
|
return _models.count;
|
}
|
|
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
TZAssetModel *model = _models[indexPath.item];
|
|
TZAssetPreviewCell *cell;
|
__weak typeof(self) weakSelf = self;
|
if (_tzImagePickerVc.allowPickingMultipleVideo && model.type == TZAssetModelMediaTypeVideo) {
|
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"TZVideoPreviewCell" forIndexPath:indexPath];
|
} else if (_tzImagePickerVc.allowPickingMultipleVideo && model.type == TZAssetModelMediaTypePhotoGif && _tzImagePickerVc.allowPickingGif) {
|
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"TZGifPreviewCell" forIndexPath:indexPath];
|
} else {
|
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"TZPhotoPreviewCell" forIndexPath:indexPath];
|
TZPhotoPreviewCell *photoPreviewCell = (TZPhotoPreviewCell *)cell;
|
photoPreviewCell.cropRect = _tzImagePickerVc.cropRect;
|
photoPreviewCell.allowCrop = _tzImagePickerVc.allowCrop;
|
__weak typeof(_tzImagePickerVc) weakTzImagePickerVc = _tzImagePickerVc;
|
__weak typeof(_collectionView) weakCollectionView = _collectionView;
|
__weak typeof(photoPreviewCell) weakCell = photoPreviewCell;
|
[photoPreviewCell setImageProgressUpdateBlock:^(double progress) {
|
__strong typeof(weakSelf) strongSelf = weakSelf;
|
__strong typeof(weakTzImagePickerVc) strongTzImagePickerVc = weakTzImagePickerVc;
|
__strong typeof(weakCollectionView) strongCollectionView = weakCollectionView;
|
__strong typeof(weakCell) strongCell = weakCell;
|
strongSelf.progress = progress;
|
if (progress >= 1) {
|
if (strongSelf.isSelectOriginalPhoto) [strongSelf showPhotoBytes];
|
if (strongSelf.alertView && [strongCollectionView.visibleCells containsObject:strongCell]) {
|
[strongTzImagePickerVc hideAlertView:strongSelf.alertView];
|
strongSelf.alertView = nil;
|
[strongSelf doneButtonClick];
|
}
|
}
|
}];
|
}
|
|
cell.model = model;
|
[cell setSingleTapGestureBlock:^{
|
__strong typeof(weakSelf) strongSelf = weakSelf;
|
[strongSelf didTapPreviewCell];
|
}];
|
return cell;
|
}
|
|
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
|
if ([cell isKindOfClass:[TZPhotoPreviewCell class]]) {
|
[(TZPhotoPreviewCell *)cell recoverSubviews];
|
}
|
}
|
|
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
|
if ([cell isKindOfClass:[TZPhotoPreviewCell class]]) {
|
[(TZPhotoPreviewCell *)cell recoverSubviews];
|
} else if ([cell isKindOfClass:[TZVideoPreviewCell class]]) {
|
[(TZVideoPreviewCell *)cell pausePlayerAndShowNaviBar];
|
}
|
}
|
|
#pragma mark - Private Method
|
|
- (void)dealloc {
|
// NSLog(@"%@ dealloc",NSStringFromClass(self.class));
|
}
|
|
- (void)refreshNaviBarAndBottomBarState {
|
TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)self.navigationController;
|
TZAssetModel *model = _models[_currentIndex];
|
_selectButton.selected = model.isSelected;
|
[self refreshSelectButtonImageViewContentMode];
|
if (_selectButton.isSelected && _tzImagePickerVc.showSelectedIndex) {
|
NSString *assetId = [[TZImageManager manager] getAssetIdentifier:model.asset];
|
NSString *index = [NSString stringWithFormat:@"%zd", [_tzImagePickerVc.selectedAssetIds indexOfObject:assetId] + 1];
|
_indexLabel.text = index;
|
_indexLabel.hidden = NO;
|
} else {
|
_indexLabel.hidden = YES;
|
}
|
_numberLabel.text = [NSString stringWithFormat:@"%zd",_tzImagePickerVc.selectedModels.count];
|
_numberImageView.hidden = (_tzImagePickerVc.selectedModels.count <= 0 || _isHideNaviBar || _isCropImage);
|
_numberLabel.hidden = (_tzImagePickerVc.selectedModels.count <= 0 || _isHideNaviBar || _isCropImage);
|
|
_originalPhotoButton.selected = _isSelectOriginalPhoto;
|
_originalPhotoLabel.hidden = !_originalPhotoButton.isSelected;
|
if (_isSelectOriginalPhoto) [self showPhotoBytes];
|
|
// If is previewing video, hide original photo button
|
// 如果正在预览的是视频,隐藏原图按钮
|
if (!_isHideNaviBar) {
|
if (model.type == TZAssetModelMediaTypeVideo) {
|
_originalPhotoButton.hidden = YES;
|
_originalPhotoLabel.hidden = YES;
|
} else {
|
_originalPhotoButton.hidden = NO;
|
if (_isSelectOriginalPhoto) _originalPhotoLabel.hidden = NO;
|
}
|
}
|
|
_doneButton.hidden = NO;
|
_selectButton.hidden = !_tzImagePickerVc.showSelectBtn;
|
// 让宽度/高度小于 最小可选照片尺寸 的图片不能选中
|
if (![[TZImageManager manager] isPhotoSelectableWithAsset:model.asset]) {
|
_numberLabel.hidden = YES;
|
_numberImageView.hidden = YES;
|
_selectButton.hidden = YES;
|
_originalPhotoButton.hidden = YES;
|
_originalPhotoLabel.hidden = YES;
|
_doneButton.hidden = YES;
|
}
|
}
|
|
- (void)refreshSelectButtonImageViewContentMode {
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
if (self->_selectButton.imageView.image.size.width <= 27) {
|
self->_selectButton.imageView.contentMode = UIViewContentModeCenter;
|
} else {
|
self->_selectButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
|
}
|
});
|
}
|
|
- (void)showPhotoBytes {
|
[[TZImageManager manager] getPhotosBytesWithArray:@[_models[_currentIndex]] completion:^(NSString *totalBytes) {
|
self->_originalPhotoLabel.text = [NSString stringWithFormat:@"(%@)",totalBytes];
|
}];
|
}
|
|
@end
|