GMPreviewListView.m 8.48 KB
//
//  PreListView.m
//  Gengmei
//
//  Created by Sean Lee on 4/7/15.
//  Copyright (c) 2015 Wanmeichuangyi. All rights reserved.
//

#import "GMPreviewListView.h"
#import <Masonry/Masonry.h>
#import <Constant.h>
@interface GMPreviewListView ()<GMPreviewCellDelegate, UIScrollViewDelegate>

@property (nonatomic, strong) UIScrollView   *scrollView;
@property (nonatomic, strong) GMPreviewCell    *defaultCell;
@property (nonatomic, assign) BOOL           hasDelete;
@property (nonatomic, assign) BOOL           frontMove;
@property (nonatomic, assign) int            moveCount;

@end

@implementation GMPreviewListView

- (void)setup{
    [super setup];
    self.backgroundColor = UIColor.whiteColor;
    _previewList = [[NSMutableArray alloc] init];
    _hasDelete = NO;
    _moveCount = 0;
    
    _scrollView = [[UIScrollView alloc] init];
    _scrollView.delegate = self;
    _scrollView.backgroundColor = UIColor.whiteColor;
    _scrollView.scrollEnabled = YES;
    
    _scrollView.directionalLockEnabled = YES;
    _scrollView.showsVerticalScrollIndicator = NO;
    _scrollView.showsHorizontalScrollIndicator = YES;
//    _scrollView.alwaysBounceHorizontal = YES;
    _scrollView.contentSize = [self contentSizeForUIScrollView:0];
    [self addSubview:_scrollView];
    if (!_cellWH) {
        _cellWH = self.cellWH;
    }
    
    _defaultCell = [[GMPreviewCell alloc] initWithFrame:CGRectMake(0, 0,PREVIRE_CELL_HEIGHT, PREVIRE_CELL_HEIGHT) image:[UIImage imageNamed:@"camera"]];
    
    _defaultCell.tag = 1000;
    _defaultCell.delegate = self;
    [_scrollView addSubview:_defaultCell];
    [self scrollViewAbleScroll];
}

- (void)setDefaultCellImage:(UIImage *)defaultCellImage {
    _defaultCellImage = defaultCellImage;
    if (_defaultCellImage != nil) {
        _defaultCell.image = _defaultCellImage;
    }
}

- (NSInteger)cellWH {
    if (_cellWH > 0) {
        CGRect rect = _defaultCell.frame;
        rect.size.width = _cellWH;
        rect.size.height = _cellWH;
        _defaultCell.frame = rect;
    } else {
        _cellWH = PREVIRE_CELL_HEIGHT;
    }
    return _cellWH;
}

- (void)updateConstraints{
    
    [_scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(00);
        make.top.mas_equalTo(00);
        make.right.mas_equalTo(0);
        make.bottom.mas_equalTo(0);
    }];
    
    [super updateConstraints];
}


/*
 *  @brief 根据index获取UIScrollView的ContentSize
 */
- (CGSize)contentSizeForUIScrollView:(NSInteger)index
{
    float width = (PREVIRE_CELL_SPACE + self.cellWH) * index;
    if (width < _scrollView.bounds.size.width)
        width = _scrollView.bounds.size.width;
    return CGSizeMake(width, PREVIRE_CELL_HEIGHT);
}


- (void)scrollViewAbleScroll
{
    _scrollView.contentSize = [self contentSizeForUIScrollView:(_previewList.count + 1)];
    [_scrollView scrollRectToVisible:CGRectMake(_scrollView.contentSize.width - self.cellWH, 0, self.cellWH, self.frame.size.height) animated:YES];
}

- (GMPreviewCell * ) addImage:(UIImage *)image{
    
    GMPreviewCell * newPreviewCell = nil;
    CGFloat x = (_previewList.count) * (PREVIRE_CELL_SPACE + self.cellWH);
    newPreviewCell = [[GMPreviewCell alloc] initWithFrame:CGRectMake(x, 0, self.cellWH, self.cellWH) image:image];
    
    newPreviewCell.alpha = 0.1;
    newPreviewCell.delegate = self;
    [_previewList addObject:newPreviewCell];
    [_scrollView addSubview:newPreviewCell];
    [self scrollViewAbleScroll];
    _defaultCell.alpha = 0.5;
    
    [UIView animateWithDuration:DURATION animations:^(){
        CGRect rect = _defaultCell.frame;
        rect.origin.x += (PREVIRE_CELL_SPACE + self.cellWH);
        _defaultCell.frame = rect;
        _defaultCell.alpha = 1.0;
        newPreviewCell.alpha = 0.8;
        
    } completion:^(BOOL finished){
        newPreviewCell.alpha = 1.0;
        
    }];
    return newPreviewCell;
}


#pragma -- mark  PreviewCellDelegate

- (void)prepareAddPreviewCell:(GMPreviewCell *)cell{
    
    if ([self.delegate respondsToSelector:@selector(addPreviewCell)]) {
        [self.delegate addPreviewCell];
    }
}

- (void)prepareDeletePreviewCell:(GMPreviewCell *)cell{
    
    NSInteger index = [_previewList indexOfObject:cell];
    //设置相关Cell的透明度
    cell.alpha = 0.8;
    // 判断其余cell的移动方向(从前向后移动/从后向前移动)
    _frontMove = NO;
    if (_previewList.count - 1 > DEFAULT_VISIBLE_COUNT
        && (_previewList.count - index - 1) <= DEFAULT_VISIBLE_COUNT) {
        _frontMove = YES;
    }
    if (index == _previewList.count - 1 && !_frontMove)
        _defaultCell.alpha = 0.5;
    
    [UIView animateWithDuration:DURATION animations:^(){
        
        //其余defautlCell依次移动
        if (_frontMove)
        {
            //前面的向后移动
            for (int i = 0; i < index; i++) {
                GMPreviewCell *cell = _previewList[i];
                CGRect rect = cell.frame;
                rect.origin.x += (PREVIRE_CELL_SPACE + self.cellWH);
                cell.frame = rect;
            }
            _moveCount++;
        }
        else
        {
            //后面的向前移动
            for (NSInteger i = index + 1; i < _previewList.count; i++) {
                GMPreviewCell *cell = _previewList[i];
                CGRect rect = cell.frame;
                rect.origin.x -= (PREVIRE_CELL_SPACE + self.cellWH);
                cell.frame = rect;
            }
            
            //defautlCell向前移动
            CGRect rect = _defaultCell.frame;
            rect.origin.x -= (PREVIRE_CELL_SPACE + self.cellWH);
            _defaultCell.frame = rect;
            _defaultCell.alpha = 1.0;
            
        }
        cell.alpha = 0.0;
        
    } completion:^(BOOL finished){
        
        if ([self.delegate respondsToSelector:@selector(deletePreviewCell:)]) {
            [self.delegate deletePreviewCell:index];
        }
        //删除被点击的cell
        [cell removeFromSuperview];
        [_previewList removeObject:cell];
        
        if (_previewList.count <= DEFAULT_VISIBLE_COUNT){
            [_scrollView setContentOffset:CGPointMake(0, 0) animated:NO];
            _scrollView.contentSize = [self contentSizeForUIScrollView:0];
        }
        
        if (_frontMove) {
            [self isNeedResetFrame];
        }
    }];
    _hasDelete = YES;
}

/**大图模式*/
- (void)didSelectedPreviewCell:(GMPreviewCell *)cell{
    
    if ([self.delegate respondsToSelector:@selector(fullScreenImage:)]) {
        [self.delegate fullScreenImage:cell];
    }
    
}


- (void)prepareRetryUploadPreviewCell:(GMPreviewCell *)cell{
    
    if ([self.delegate respondsToSelector:@selector(retryUploadPreviewCell:)]) {
        [self.delegate retryUploadPreviewCell:cell];
    }
    
}

/**
 *  @brief 当删除操作是前面的unitCell向后移动时
 *  做滚动操作或者添加操作需要重新设置每个unitCell的frame
 */
- (void)isNeedResetFrame
{
    if (_frontMove && _moveCount > 0) {
        for (int i = 0; i < _previewList.count; i++) {
            GMPreviewCell *cell = [_previewList objectAtIndex:(NSUInteger) i];
            CGRect rect = cell.frame;
            rect.origin.x -= (PREVIRE_CELL_SPACE + self.cellWH) * _moveCount;
            cell.frame = rect;
        }
        
        CGRect rect = _defaultCell.frame;
        rect.origin.x -= (PREVIRE_CELL_SPACE + self.cellWH) * _moveCount;
        _defaultCell.frame = rect;
        
        _frontMove = NO;
        _moveCount = 0;
    }
    
    if (_hasDelete)
    {
        _scrollView.contentSize = [self contentSizeForUIScrollView:(_previewList.count + 1)];
        _hasDelete = !_hasDelete;
    }
}

/***  @brief  开始上传,显示loading */
- (void)showLoadingAtIndex:(NSInteger)index{
    GMPreviewCell * cell = _previewList[index];
    [cell.retryButton setHidden:YES];
    [cell.deleteButton setHidden:YES];
    [cell.indicatorView setHidden:NO];
    [cell.indicatorView startAnimating];
}

/***  @brief  上传成功,隐藏loading */
- (void)hideLoadingAtIndex:(NSInteger)index{
    
    GMPreviewCell * cell = _previewList[index];
    [cell.retryButton setHidden:YES];
    [cell.deleteButton setHidden:NO];
    [cell.indicatorView setHidden:YES];
    [cell.indicatorView stopAnimating];
}

/***  @brief 重新上传loading */
- (void)retryLoadingAtIndex:(NSInteger)index{
    if (index > _previewList.count - 1){
        return;
    }
    GMPreviewCell * cell = _previewList[index];
    [cell.retryButton setHidden:NO];
    [cell.deleteButton setHidden:NO];
    [cell.indicatorView setHidden:YES];
    [cell.indicatorView stopAnimating];
}

@end