在开发中,经常用到选择多张图片进行上传或作其他处理等等,以下DEMO满足了此功能中的大部分功能,可直接使用到项目中。
主要功能如下:
1,图片九宫格排列(可自动设置)
2,图片长按抖动(仿苹果软件删除时,图标抖动效果),可进入删除状态,再次单击进入普通状态
3,图片设置最大上限,加号按钮自动隐藏
4,已选图片可单击进行重新选择
5,无需代理,直接调用对应属性就可获取所有图片,并与显示顺序保持一致
效果图如下:
1//2//SZAddImage.h3//addImage4//5//Created by mac on 14-5-21.6//Copyright (c) 2014年 shunzi. All rights reserved.7//89/**10* 使用说明:直接创建此view添加到你需要放置的位置即可.11* 属性images可以获取到当前选中的所有图片对象.12*/1314#import<UIKit/UIKit.h>1516@interfaceSZAddImage : UIView1718/**19* 存储所有的照片(UIImage)20*/21@PRoperty (nonatomic, strong) NSMutableArray *images;2223@end
1//2//SZAddImage.m3//addImage4//5//Created by mac on 14-5-21.6//Copyright (c) 2014年 shunzi. All rights reserved.7//89#defineimageH 100//图片高度10#defineimageW 75//图片宽度11#definekMaxColumn 3//每行显示数量12#defineMaxImageCount 9//最多显示图片个数13#definedeleImageWH 25//删除按钮的宽高14#definekAdeleImage @"close.png"//删除按钮图片15#definekAddImage @"add.png"//添加按钮图片16171819#import"SZAddImage.h"20@interfaceSZAddImage()<UINavigationControllerDelegate, UIImagePickerControllerDelegate>21{22//标识被编辑的按钮 -1 为添加新的按钮23NSInteger editTag;24}25@end2627@implementationSZAddImage2829- (id)initWithFrame:(CGRect)frame30{31self =[super initWithFrame:frame];32if(self) {33UIButton *btn =[self createButtonWithImage:kAddImage andSeletor:@selector(addNew:)];34[self addSubview:btn];35}36returnself;37}3839-(NSMutableArray *)images40{41if(_images ==nil) {42_images =[NSMutableArray array];43}44return_images;45}4647//添加新的控件48- (void)addNew:(UIButton *)btn49{50//标识为添加一个新的图片5152if(![self deleClose:btn]) {53editTag = -1;54[self callImagePicker];55}565758}5960//修改旧的控件61- (void)changeOld:(UIButton *)btn62{63//标识为修改(tag为修改标识)64if(![self deleClose:btn]) {65editTag =btn.tag;66[self callImagePicker];67}68}6970//删除"删除按钮"71- (BOOL)deleClose:(UIButton *)btn72{73if(btn.subviews.count ==2) {74[[btn.subviews lastObject] removeFromSuperview];75[self stop:btn];76returnYES;77}7879returnNO;80}8182//调用图片选择器83- (void)callImagePicker84{85UIImagePickerController *pc =[[UIImagePickerController alloc] init];86pc.allowsEditing =YES;87pc.delegate=self;88[self.window.rootViewController presentViewController:pc animated:YES completion:nil];89}909192//根据图片名称或者图片创建一个新的显示控件93- (UIButton *)createButtonWithImage:(id)imageNameOrImage andSeletor : (SEL)selector94{95UIImage *addImage =nil;96if([imageNameOrImage isKindOfClass:[NSStringclass]]) {97addImage =[UIImage imageNamed:imageNameOrImage];98}99elseif([imageNameOrImage isKindOfClass:[UIImageclass]])100{101addImage =imageNameOrImage;102}103UIButton *addBtn =[UIButton buttonWithType:UIButtonTypeCustom];104[addBtn setImage:addImage forState:UIControlStateNormal];105[addBtn addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside];106addBtn.tag =self.subviews.count;107108//添加长按手势,用作删除.加号按钮不添加109if(addBtn.tag !=0)110{111UILongPressGestureRecognizer *gester =[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];112[addBtn addGestureRecognizer:gester];113}114returnaddBtn;115116}117118119//长按添加删除按钮120- (void)longPress : (UIGestureRecognizer *)gester121{122if(gester.state ==UIGestureRecognizerStateBegan)123{124UIButton *btn = (UIButton *)gester.view;125126UIButton *dele =[UIButton buttonWithType:UIButtonTypeCustom];127dele.bounds = CGRectMake(0,0, deleImageWH, deleImageWH);128[dele setImage:[UIImage imageNamed:kAdeleImage] forState:UIControlStateNormal];129[dele addTarget:self action:@selector(deletePic:) forControlEvents:UIControlEventTouchUpInside];130dele.frame = CGRectMake(btn.frame.size.width - dele.frame.size.width,0, dele.frame.size.width, dele.frame.size.height);131132[btn addSubview:dele];133[self start : btn];134135136}137138}139140//长按开始抖动141- (void)start : (UIButton *)btn {142doubleangle1 = -5.0/180.0*M_PI;143doubleangle2 =5.0/180.0*M_PI;144CAKeyframeAnimation *anim =[CAKeyframeAnimation animation];145anim.keyPath =@"transform.rotation";146147anim.values =@[@(angle1), @(angle2), @(angle1)];148anim.duration =0.25;149//动画的重复执行次数150anim.repeatCount =MAXFLOAT;151152//保持动画执行完毕后的状态153anim.removedOnCompletion =NO;154anim.fillMode =kCAFillModeForwards;155156[btn.layer addAnimation:anim forKey:@"shake"];157}158159//停止抖动160- (void)stop : (UIButton *)btn{161[btn.layer removeAnimationForKey:@"shake"];162}163164//删除图片165- (void)deletePic : (UIButton *)btn166{167[self.images removeObject:[(UIButton *)btn.superview imageForState:UIControlStateNormal]];168[btn.superview removeFromSuperview];169if([[self.subviews lastObject] isHidden]) {170[[self.subviews lastObject] setHidden:NO];171}172173174}175176//对所有子控件进行布局177- (void)layoutSubviews178{179[super layoutSubviews];180intcount =self.subviews.count;181CGFloat btnW =imageW;182CGFloat btnH =imageH;183intmaxColumn = kMaxColumn > self.frame.size.width / imageW ? self.frame.size.width /imageW : kMaxColumn;184CGFloat marginX = (self.frame.size.width - maxColumn * btnW) / (count +1);185CGFloat marginY =marginX;186for(inti =0; i < count; i++) {187UIButton *btn =self.subviews[i];188CGFloat btnX = (i % maxColumn) * (marginX + btnW) +marginX;189CGFloat btnY = (i / maxColumn) * (marginY + btnH) +marginY;190btn.frame =CGRectMake(btnX, btnY, btnW, btnH);191}192193}194195#pragmamark - UIImagePickerController 代理方法196-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info197{198UIImage *image =info[UIImagePickerControllerEditedImage];199if(editTag == -1) {200//创建一个新的控件201UIButton *btn =[self createButtonWithImage:image andSeletor:@selector(changeOld:)];202[self insertSubview:btn atIndex:self.subviews.count -1];203[self.images addObject:image];204if(self.subviews.count -1==MaxImageCount) {205[[self.subviews lastObject] setHidden:YES];206207}208}209else210{211//根据tag修改需要编辑的控件212UIButton *btn = (UIButton *)[self viewWithTag:editTag];213intindex =[self.images indexOfObject:[btn imageForState:UIControlStateNormal]];214[self.images removeObjectAtIndex:index];215[btn setImage:image forState:UIControlStateNormal];216[self.images insertObject:image atIndex:index];217}218//退出图片选择控制器219[picker dismissViewControllerAnimated:YES completion:nil];220}221222223224@end