| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- //
- // 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 (_selectPhotoButton == 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
|