//
|
// 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
|