一,效果圖。 二,工程圖。 三,代碼。 ViewController.h ViewController.m photoCollectionViewCell.h photoCollectionViewCell.m ...
一,效果圖。
二,工程圖。
三,代碼。
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,UIAlertViewDelegate,UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate>
{
UICollectionView *_collectionView;
UIImagePickerController *_imagePicker;
NSMutableArray *photos;
NSMutableArray *dataArray;
NSInteger deleteIndex;
BOOL wobble;
}
@end
ViewController.m
//點擊添加按鈕的時候,停止刪除。
#import "ViewController.h"
#import "photoCollectionViewCell.h"
NSInteger const Photo = 8;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//其佈局很有意思,當你的cell設置大小後,一行多少個cell,由cell的寬度決定
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
//設置cell的尺寸
[flowLayout setItemSize:CGSizeMake(70, 70)];
//設置其佈局方向
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
//設置其邊界(上,左,下,右)
flowLayout.sectionInset = UIEdgeInsetsMake(5,5,5,5);
_collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(10, 50, 320,85*2) collectionViewLayout:flowLayout];
_collectionView.dataSource = self;
_collectionView.delegate = self;
_collectionView.backgroundColor = [UIColor redColor];
[_collectionView registerClass:[photoCollectionViewCell class] forCellWithReuseIdentifier:@"photo"];
[self.view addSubview:_collectionView];
photos = [[NSMutableArray alloc ] init];
dataArray = [[NSMutableArray alloc ] init];
[dataArray addObject:[UIImage imageNamed:@"contract_addpic1"]];
}
//section
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}
//item個數
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return dataArray.count;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"--indexPath.row--%ld",indexPath.row);
NSLog(@"---indexpath.section--%ld",indexPath.section);
photoCollectionViewCell *cell = (photoCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"photo" forIndexPath:indexPath];
cell.tag=indexPath.row;
//圖片
cell.photoImage.image=dataArray[indexPath.row];
// 刪除按鈕
cell.deleteBtn.tag =indexPath.row;
cell.deleteBtn.hidden=YES;
[cell.deleteBtn addTarget:self action:@selector(doClickDeleteButton:) forControlEvents:UIControlEventTouchUpInside];
//增加按鈕
if (indexPath.row == dataArray.count -1) {
cell.addBtn.hidden = NO;
}else
{
cell.addBtn.hidden = YES;
}
[cell.addBtn addTarget:self action:@selector(doClickAddButton:) forControlEvents:UIControlEventTouchUpInside];
// 長按刪除
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc ] initWithTarget:self action:@selector(longPressedAction)];
[cell.contentView addGestureRecognizer:longPress];
return cell;
}
#pragma -mark -doClickActions
//刪除按鈕
-(void)doClickDeleteButton:(UIButton *)btn
{
NSLog(@"-----doClickDeleteButton-------");
UIAlertView *alert = [[UIAlertView alloc ] initWithTitle:@"提示" message:@"您確定要刪除嗎?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
deleteIndex = btn.tag;
[alert show];
NSLog(@"---delete--dataArray---%@",dataArray);
}
//增加按鈕
-(void)doClickAddButton:(UIButton *)btn
{
NSLog(@"-----doClickAddButton-------");
if (wobble) {
// 如果是編輯狀態則取消編輯狀態
[self cancelWobble];
}else{
//不是編輯狀態,添加圖片
if (dataArray.count > Photo) {
UIAlertView *alert = [[UIAlertView alloc ] initWithTitle:@"提示" message:@"最多支持8個" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
[alert show];
}else
{
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:nil
delegate:(id)self
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles:@"拍照", @"我的相冊",nil];
actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
[actionSheet showInView:self.view];
}
}
NSLog(@"---add--dataArray---%@",dataArray);
}
//長按刪除
-(void)longPressedAction
{
NSLog(@"-----longPressedAction-------");
wobble = YES;
NSArray *array = [_collectionView subviews];
for (int i = 0; i < array.count; i ++) {
if ([array[i] isKindOfClass:[photoCollectionViewCell class]]) {
photoCollectionViewCell *cell = array[i];
if (cell.addBtn.hidden) {
cell.deleteBtn.hidden = NO;
}
else
{
cell.deleteBtn.hidden = YES;
cell.photoImage.image = [UIImage imageNamed:@"ensure"];
cell.tag = 999999;
}
// 晃動動畫
[self animationViewCell:cell];
}
}
}
// 取消晃動
-(void)cancelWobble
{
wobble = NO;
NSArray *array = [_collectionView subviews];
for (int i = 0; i < array.count; i ++) {
if ([array[i] isKindOfClass:[photoCollectionViewCell class]]) {
photoCollectionViewCell *cell = array[i];
cell.deleteBtn.hidden = YES;
if (cell.tag == 999999) {
cell.photoImage.image = [UIImage imageNamed:@"plus"];
}
// 晃動動畫
[self animationViewCell:cell];
}
}
}
// 晃動動畫
-(void)animationViewCell:(photoCollectionViewCell *)cell
{
//搖擺
if (wobble){
cell.transform = CGAffineTransformMakeRotation(-0.1);
[UIView animateWithDuration:0.08
delay:0.0
options:UIViewAnimationOptionRepeat|UIViewAnimationOptionAutoreverse|UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveLinear
animations:^{
cell.transform = CGAffineTransformMakeRotation(0.1);
} completion:nil];
}
else{
[UIView animateWithDuration:0.25
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseOut
animations:^{
cell.transform = CGAffineTransformIdentity;
} completion:nil];
}
}
#pragma -mark -UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0) {
[self openCamera];
}else if(buttonIndex == 1) {
[self openPics];
}
}
#pragma -mark -UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) {
[dataArray removeObjectAtIndex:deleteIndex];
NSIndexPath *path = [NSIndexPath indexPathForRow:deleteIndex inSection:0];
[_collectionView deleteItemsAtIndexPaths:@[path]];
// 如果刪除完,則取消編輯
if (dataArray.count == 1) {
[self cancelWobble];
}
// 沒有刪除完,執行晃動動畫
else
{
[self longPressedAction];
}
}
}
#pragma -mark -camera
// 打開相機
- (void)openCamera {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
if (_imagePicker == nil) {
_imagePicker = [[UIImagePickerController alloc] init];
}
_imagePicker.delegate = (id)self;
_imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
_imagePicker.showsCameraControls = YES;
_imagePicker.allowsEditing = YES;
[self.navigationController presentViewController:_imagePicker animated:YES completion:nil];
}
}
// 打開相冊
- (void)openPics {
if (_imagePicker == nil) {
_imagePicker = [[UIImagePickerController alloc] init];
}
_imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
_imagePicker.allowsEditing = YES;
_imagePicker.delegate = (id)self;
[self presentViewController:_imagePicker animated:YES completion:NULL];
}
// 選中照片
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
[_imagePicker dismissViewControllerAnimated:YES completion:NULL];
_imagePicker = nil;
// 判斷獲取類型:圖片
if ([mediaType isEqualToString:@"public.image"]){
UIImage *theImage = nil;
// 判斷,圖片是否允許修改
if ([picker allowsEditing]){
//獲取用戶編輯之後的圖像
theImage = [info objectForKey:UIImagePickerControllerEditedImage];
} else {
// 照片的元數據參數
theImage = [info objectForKey:UIImagePickerControllerOriginalImage] ;
}
[dataArray insertObject:theImage atIndex:0];
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:0];
[_collectionView insertItemsAtIndexPaths:@[path]];
}
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissViewControllerAnimated:YES completion:NULL];
}
// 判斷設備是否有攝像頭
- (BOOL) isCameraAvailable{
return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
}
#pragma mark - 相冊文件選取相關
// 相冊是否可用
- (BOOL) isPhotoLibraryAvailable{
return [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
photoCollectionViewCell.h
#import <UIKit/UIKit.h>
@interface photoCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UIButton *addBtn;
@property (weak, nonatomic) IBOutlet UIImageView *photoImage;
@property (weak, nonatomic) IBOutlet UIButton *deleteBtn;
@end
photoCollectionViewCell.m
#import "photoCollectionViewCell.h"
@implementation photoCollectionViewCell
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// 初始化時載入collectionCell.xib文件
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"photoCollectionViewCell" owner:self options:nil];
// 如果路徑不存在,return nil
if (arrayOfViews.count < 1)
{
return nil;
}
// 如果xib中view不屬於UICollectionViewCell類,return nil
if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]])
{
return nil;
}
// 載入nib
self = [arrayOfViews objectAtIndex:0];
}
return self;
}
- (void)awakeFromNib {
// Initialization code
}
@end