// // TZAssetCell.m // TZImagePickerController // // Created by 谭真 on 15/12/24. // Copyright © 2015年 谭真. All rights reserved. // #import "TZAssetCell.h" #import "TZAssetModel.h" #import "UIView+Layout.h" #import "TZImageManager.h" #import "TZImagePickerController.h" #import "TZProgressView.h" @interface TZAssetCell () @property (weak, nonatomic) UIImageView *imageView; // The photo / 照片 @property (weak, nonatomic) UIImageView *selectImageView; @property (weak, nonatomic) UIView *bottomView; @property (weak, nonatomic) UILabel *timeLength; @property (nonatomic, weak) UIImageView *videoImgView; @property (nonatomic, strong) TZProgressView *progressView; @property (nonatomic, assign) PHImageRequestID bigImageRequestID; @end @implementation TZAssetCell - (void)setModel:(TZAssetModel *)model { _model = model; if (iOS8Later) { self.representedAssetIdentifier = [[TZImageManager manager] getAssetIdentifier:model.asset]; } PHImageRequestID imageRequestID = [[TZImageManager manager] getPhotoWithAsset:model.asset photoWidth:self.tz_width completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { if (_progressView) { self.progressView.hidden = YES; self.imageView.alpha = 1.0; } // Set the cell's thumbnail image if it's still showing the same asset. if (!iOS8Later) { self.imageView.image = photo; return; } if ([self.representedAssetIdentifier isEqualToString:[[TZImageManager manager] getAssetIdentifier:model.asset]]) { self.imageView.image = photo; } else { // NSLog(@"this cell is showing other asset"); [[PHImageManager defaultManager] cancelImageRequest:self.imageRequestID]; } if (!isDegraded) { self.imageRequestID = 0; } } progressHandler:nil networkAccessAllowed:NO]; if (imageRequestID && self.imageRequestID && imageRequestID != self.imageRequestID) { [[PHImageManager defaultManager] cancelImageRequest:self.imageRequestID]; // NSLog(@"cancelImageRequest %d",self.imageRequestID); } self.imageRequestID = imageRequestID; self.selectPhotoButton.selected = model.isSelected; self.selectImageView.image = self.selectPhotoButton.isSelected ? [UIImage imageNamedFromMyBundle:self.photoSelImageName] : [UIImage imageNamedFromMyBundle:self.photoDefImageName]; self.type = (NSInteger)model.type; // 让宽度/高度小于 最小可选照片尺寸 的图片不能选中 if (![[TZImageManager manager] isPhotoSelectableWithAsset:model.asset]) { if (_selectImageView.hidden == NO) { self.selectPhotoButton.hidden = YES; _selectImageView.hidden = YES; } } // 如果用户选中了该图片,提前获取一下大图 if (model.isSelected) { [self fetchBigImage]; } } - (void)setShowSelectBtn:(BOOL)showSelectBtn { _showSelectBtn = showSelectBtn; if (!self.selectPhotoButton.hidden) { self.selectPhotoButton.hidden = !showSelectBtn; } if (!self.selectImageView.hidden) { self.selectImageView.hidden = !showSelectBtn; } } - (void)setType:(TZAssetCellType)type { _type = type; if (type == TZAssetCellTypePhoto || type == TZAssetCellTypeLivePhoto || (type == TZAssetCellTypePhotoGif && !self.allowPickingGif)) { _selectImageView.hidden = NO; _selectPhotoButton.hidden = NO; _bottomView.hidden = YES; } else { // Video of Gif _selectImageView.hidden = YES; _selectPhotoButton.hidden = YES; _bottomView.hidden = NO; if (type == TZAssetCellTypeVideo) { self.timeLength.text = _model.timeLength; self.videoImgView.hidden = NO; _timeLength.tz_left = self.videoImgView.tz_right; _timeLength.textAlignment = NSTextAlignmentRight; } else { self.timeLength.text = @"GIF"; self.videoImgView.hidden = YES; _timeLength.tz_left = 5; _timeLength.textAlignment = NSTextAlignmentLeft; } } } - (void)selectPhotoButtonClick:(UIButton *)sender { if (self.didSelectPhotoBlock) { self.didSelectPhotoBlock(sender.isSelected); } self.selectImageView.image = sender.isSelected ? [UIImage imageNamedFromMyBundle:self.photoSelImageName] : [UIImage imageNamedFromMyBundle:self.photoDefImageName]; if (sender.isSelected) { [UIView showOscillatoryAnimationWithLayer:_selectImageView.layer type:TZOscillatoryAnimationToBigger]; // 用户选中了该图片,提前获取一下大图 [self fetchBigImage]; } else { // 取消选中,取消大图的获取 if (_bigImageRequestID && _progressView) { [[PHImageManager defaultManager] cancelImageRequest:_bigImageRequestID]; [self hideProgressView]; } } } - (void)hideProgressView { self.progressView.hidden = YES; self.imageView.alpha = 1.0; } - (void)fetchBigImage { _bigImageRequestID = [[TZImageManager manager] getPhotoWithAsset:_model.asset completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { if (_progressView) { [self hideProgressView]; } } progressHandler:^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { if (_model.isSelected) { progress = progress > 0.02 ? progress : 0.02;; self.progressView.progress = progress; self.progressView.hidden = NO; self.imageView.alpha = 0.4; } else { *stop = YES; [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; } } networkAccessAllowed:YES]; } #pragma mark - Lazy load - (UIButton *)selectPhotoButton { if (_selectImageView == nil) { UIButton *selectPhotoButton = [[UIButton alloc] init]; selectPhotoButton.frame = CGRectMake(self.tz_width - 44, 0, 44, 44); [selectPhotoButton addTarget:self action:@selector(selectPhotoButtonClick:) forControlEvents:UIControlEventTouchUpInside]; [self.contentView addSubview:selectPhotoButton]; _selectPhotoButton = selectPhotoButton; } return _selectPhotoButton; } - (UIImageView *)imageView { if (_imageView == nil) { UIImageView *imageView = [[UIImageView alloc] init]; imageView.frame = CGRectMake(0, 0, self.tz_width, self.tz_height); imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.clipsToBounds = YES; [self.contentView addSubview:imageView]; _imageView = imageView; [self.contentView bringSubviewToFront:_selectImageView]; [self.contentView bringSubviewToFront:_bottomView]; } return _imageView; } - (UIImageView *)selectImageView { if (_selectImageView == nil) { UIImageView *selectImageView = [[UIImageView alloc] init]; selectImageView.frame = CGRectMake(self.tz_width - 27, 0, 27, 27); [self.contentView addSubview:selectImageView]; _selectImageView = selectImageView; } return _selectImageView; } - (UIView *)bottomView { if (_bottomView == nil) { UIView *bottomView = [[UIView alloc] init]; bottomView.frame = CGRectMake(0, self.tz_height - 17, self.tz_width, 17); static NSInteger rgb = 0; bottomView.backgroundColor = [UIColor colorWithRed:rgb green:rgb blue:rgb alpha:0.8]; [self.contentView addSubview:bottomView]; _bottomView = bottomView; } return _bottomView; } - (UIImageView *)videoImgView { if (_videoImgView == nil) { UIImageView *videoImgView = [[UIImageView alloc] init]; videoImgView.frame = CGRectMake(8, 0, 17, 17); [videoImgView setImage:[UIImage imageNamedFromMyBundle:@"VideoSendIcon.png"]]; [self.bottomView addSubview:videoImgView]; _videoImgView = videoImgView; } return _videoImgView; } - (UILabel *)timeLength { if (_timeLength == nil) { UILabel *timeLength = [[UILabel alloc] init]; timeLength.font = [UIFont boldSystemFontOfSize:11]; timeLength.frame = CGRectMake(self.videoImgView.tz_right, 0, self.tz_width - self.videoImgView.tz_right - 5, 17); timeLength.textColor = [UIColor whiteColor]; timeLength.textAlignment = NSTextAlignmentRight; [self.bottomView addSubview:timeLength]; _timeLength = timeLength; } return _timeLength; } - (TZProgressView *)progressView { if (_progressView == nil) { _progressView = [[TZProgressView alloc] init]; static CGFloat progressWH = 20; CGFloat progressXY = (self.tz_width - progressWH) / 2; _progressView.hidden = YES; _progressView.frame = CGRectMake(progressXY, progressXY, progressWH, progressWH); [self addSubview:_progressView]; } return _progressView; } @end @interface TZAlbumCell () @property (weak, nonatomic) UIImageView *posterImageView; @property (weak, nonatomic) UILabel *titleLabel; @property (weak, nonatomic) UIImageView *arrowImageView; @end @implementation TZAlbumCell - (void)setModel:(TZAlbumModel *)model { _model = model; NSMutableAttributedString *nameString = [[NSMutableAttributedString alloc] initWithString:model.name attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16],NSForegroundColorAttributeName:[UIColor blackColor]}]; NSAttributedString *countString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@" (%zd)",model.count] attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16],NSForegroundColorAttributeName:[UIColor lightGrayColor]}]; [nameString appendAttributedString:countString]; self.titleLabel.attributedText = nameString; [[TZImageManager manager] getPostImageWithAlbumModel:model completion:^(UIImage *postImage) { self.posterImageView.image = postImage; }]; if (model.selectedCount) { self.selectedCountButton.hidden = NO; [self.selectedCountButton setTitle:[NSString stringWithFormat:@"%zd",model.selectedCount] forState:UIControlStateNormal]; } else { self.selectedCountButton.hidden = YES; } } /// For fitting iOS6 - (void)layoutSubviews { if (iOS7Later) [super layoutSubviews]; _selectedCountButton.frame = CGRectMake(self.tz_width - 24 - 30, 23, 24, 24); } - (void)layoutSublayersOfLayer:(CALayer *)layer { if (iOS7Later) [super layoutSublayersOfLayer:layer]; } #pragma mark - Lazy load - (UIImageView *)posterImageView { if (_posterImageView == nil) { UIImageView *posterImageView = [[UIImageView alloc] init]; posterImageView.contentMode = UIViewContentModeScaleAspectFill; posterImageView.clipsToBounds = YES; posterImageView.frame = CGRectMake(0, 0, 70, 70); [self.contentView addSubview:posterImageView]; _posterImageView = posterImageView; } return _posterImageView; } - (UILabel *)titleLabel { if (_titleLabel == nil) { UILabel *titleLabel = [[UILabel alloc] init]; titleLabel.font = [UIFont boldSystemFontOfSize:17]; titleLabel.frame = CGRectMake(80, 0, self.tz_width - 80 - 50, self.tz_height); titleLabel.textColor = [UIColor blackColor]; titleLabel.textAlignment = NSTextAlignmentLeft; [self.contentView addSubview:titleLabel]; _titleLabel = titleLabel; } return _titleLabel; } - (UIImageView *)arrowImageView { if (_arrowImageView == nil) { UIImageView *arrowImageView = [[UIImageView alloc] init]; CGFloat arrowWH = 15; arrowImageView.frame = CGRectMake(self.tz_width - arrowWH - 12, 28, arrowWH, arrowWH); [arrowImageView setImage:[UIImage imageNamedFromMyBundle:@"TableViewArrow.png"]]; [self.contentView addSubview:arrowImageView]; _arrowImageView = arrowImageView; } return _arrowImageView; } - (UIButton *)selectedCountButton { if (_selectedCountButton == nil) { UIButton *selectedCountButton = [[UIButton alloc] init]; selectedCountButton.layer.cornerRadius = 12; selectedCountButton.clipsToBounds = YES; selectedCountButton.backgroundColor = [UIColor redColor]; [selectedCountButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; selectedCountButton.titleLabel.font = [UIFont systemFontOfSize:15]; [self.contentView addSubview:selectedCountButton]; _selectedCountButton = selectedCountButton; } return _selectedCountButton; } @end @implementation TZAssetCameraCell - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor whiteColor]; _imageView = [[UIImageView alloc] init]; _imageView.backgroundColor = [UIColor colorWithWhite:1.000 alpha:0.500]; _imageView.contentMode = UIViewContentModeScaleAspectFill; [self addSubview:_imageView]; self.clipsToBounds = YES; } return self; } - (void)layoutSubviews { [super layoutSubviews]; _imageView.frame = self.bounds; } @end