简单集成高大上的ImagePicker无标题文章

 

现在是个项目就要有图片上传所以下面介绍一下简单高端的图片选择器

感谢读者的细心发现bug,最近bug已经修复(github更新)所以对文章部分内容做出修改。

然后看一下实现代码 和效果图对比你就知道绝对可以带你装b带你飞!

B4F25DEC157D88BE0026E2246BB3445A.png

7D1EE10E2E807ED40427A9637211424B.jpg

8C2FC9D402191A7AD594F40FBA5AF23B.png

09D89C93E76EB1D38884A776AE486A59.png

AE2B983D7094C46948C372FD191D90BB.jpg

实现代码  可选择代理和block 我就直接都写上了 自己选择

#import"DzyImgPicker.h"#define
DzyWid ([UIScreen mainScreen].bounds.size.width)#define DzyHei
([UIScreen mainScreen].bounds.size.height)@interfaceViewController() {   
DzyImgPicker *DzyView;}@end- (void)viewWillAppear:(BOOL)animated{   
[superviewWillAppear:animated];//从相册返回的话需要刷新下界面[DzyView.collectionView
reloadData];}#pragma - DzyImgDelegate-
(void)getImages:(NSArray*)imgData{//此处返回的是选择图片的数组}- (void)viewDidLoad { 
  [superviewDidLoad];self.view.backgroundColor =
[UIColorwhiteColor];//此处需要注意  自己计算一下  我设置的每个cell 是60*60  间距10 所以 这里一般是设置
全屏宽度  如有特殊需求自行修改DzyView = [[DzyImgPicker alloc]
initWithFrame:CGRectMake(0,160, DzyWid,200)
andParentV:selfandMaxNum:9];    DzyView.dzyImgDelegate =self;   
DzyView.backgroundColor = [UIColororangeColor];    [self.view
addSubview:DzyView];    __weaktypeof(self)weakSelf =self;    [DzyView
setDzyImgs:^(NSArray*data) {//此处返回的是选择图片的数组}];// Do any additional setup
after loading the view.}

直接上代码看一下封装过程 DzyImgPicker.h

#import@protocolDzyImgDelegate//
代理方式返回数组-
(void)getImages:(NSArray*)imgData;@end@interfaceDzyImgPicker:UIView//初始化
添加父类view进去- (instancetype)initWithFrame:(CGRect)frame
andParentV:(UIViewController*)parentV
andMaxNum:(NSInteger)maxNum;//处理block
返回的图片@property(nonatomic)void(^DzyImgs)(NSArray*data);//从选择器返回的时候需要刷新界面
所以在每次界面将要显示的时候刷新用
@property(nonatomic)UICollectionView*collectionView;@property(nonatomic)id
dzyImgDelegate;@end

DzyImgPicker.m

#import"DzyImgPicker.h"#import"LGPhoto.h"#import"MLPhotoBrowserViewController.h"#import"imageCell.h"@interfaceDzyImgPicker()
{//存储图片NSMutableArray*imageArray;}//最大的图片张数
@property(nonatomic)NSIntegermaxNum;//父类的
view@property(nonatomic)UIViewController*parentV;@property(nonatomic,assign)
LGShowImageType showType;@end@implementationDzyImgPicker#pragma mark --
(NSInteger)
numberOfSectionInPhotosInPhotoBrowser:(MLPhotoBrowserViewController
*)photoBrowser{return1;}- (NSInteger)
photoBrowser:(MLPhotoBrowserViewController *)photoBrowser
numberOfItemsInSection:(NSUInteger)section{returnimageArray.count;}#pragma
mark - 每个组展示什么图片,需要包装下ZLPhotoPickerBrowserPhoto- (MLPhotoBrowserPhoto
*)photoBrowser:(MLPhotoBrowserViewController *)photoBrowser
photoAtIndexPath:(NSIndexPath*)indexPath{    MLPhotoBrowserPhoto *photo =
[MLPhotoBrowserPhoto photoAnyImageObjWith:imageArray[indexPath.row]];   
imageCell *cell = (imageCell *)[_collectionView
cellForItemAtIndexPath:indexPath];    photo.toView = cell.imgView;   
photo.thumbImage = cell.imgView.image;returnphoto;}#pragma mark -#pragma
mark 删除照片调用- (void)photoBrowser:(MLPhotoBrowserViewController
*)photoBrowser
removePhotoAtIndexPath:(NSIndexPath*)indexPat{if(imageArray.count ==1)
{        [imageArray removeAllObjects];    }else{        [imageArray
removeObjectAtIndex:indexPat.row];        [self.collectionView
reloadData];    }}#pragma mark - setupCell click
ZLPhotoPickerBrowserViewController- (void) setupPhotoBrowser:(imageCell
*) cell{NSIndexPath*indexPath = [self.collectionView
indexPathForCell:cell];// 图片游览器MLPhotoBrowserViewController
*photoBrowser = [[MLPhotoBrowserViewController alloc] init];//
缩放动画photoBrowser.status =UIViewAnimationAnimationStatusZoom;//
可以删除photoBrowser.editing =YES;// delegatephotoBrowser.delegate =self;//
数据源photoBrowser.dataSource =self;// 当前选中的值photoBrowser.currentIndexPath =
[NSIndexPathindexPathForItem:indexPath.row inSection:0];//
展示控制器[photoBrowser show];}/**

*  初始化自定义相机(连拍)

*/#pragma mark
- *初始化自定义相机(连拍)- (void)presentCameraContinuous {   
ZLCameraViewController *cameraVC = [[ZLCameraViewController alloc]
init];// 拍照最多个数cameraVC.maxCount =self.maxNum-imageArray.count;//
连拍cameraVC.cameraType = ZLCameraContinuous;    cameraVC.callback =
^(NSArray*cameras){//在这里得到拍照结果//数组元素是ZLCamera对象for(ZLCamera
*canamerincameras) {            [imageArray
addObject:canamer.photoImage];       
}NSLog(@"%lu",(unsignedlong)imageArray.count);   
};//展示在父类的View上[cameraVC showPickerVc:self.parentV];   
[self.collectionView reloadData];}#pragma mark -
*LGPhotoPickerViewControllerDelegate-
(void)pickerViewControllerDoneAsstes:(NSArray*)assets
isOriginal:(BOOL)original{//thumbImage (缩略图)  fullResolutionImage(全屏图) 
原图(originImage)NSMutableArray*originImage =
[NSMutableArrayarray];for(LGPhotoAssets *photoinassets)
{//原图[originImage addObject:photo.originImage];        [imageArray
addObject:photo.originImage];    }    [self.collectionView
reloadData];}#pragma mark -  *  初始化相册选择器-
(void)presentPhotoPickerViewControllerWithStyle:(LGShowImageType)style
{    LGPhotoPickerViewController *pickerVc =
[[LGPhotoPickerViewController alloc] initWithShowType:style];   
pickerVc.status = PickerViewShowStatusCameraRoll;    pickerVc.maxCount
=self.maxNum-imageArray.count;//设置选择张数上线pickerVc.delegate
=self;self.showType = style;//展示在父类的view上[pickerVc
showPickerVc:self.parentV];}#pragma mark *UIActionsheetDelegate-
(void)actionSheet:(UIActionSheet*)actionSheet
clickedButtonAtIndex:(NSInteger)buttonIndex{NSString*msg =
[NSStringstringWithFormat:@"选取图片最大为%ld张!",
(long)self.maxNum];switch(buttonIndex) {case0:       
{NSLog(@"相机");if(self.maxNum-imageArray.count ==0) {UIAlertView*al =
[[UIAlertViewalloc] initWithTitle:@"提示"message:msg
delegate:nilcancelButtonTitle:nilotherButtonTitles:@"知道了",nil];         
      [al show];            }else{               
[selfpresentCameraContinuous];            }        }break;case1:       
{NSLog(@"相册");if(self.maxNum-imageArray.count ==0) {UIAlertView*al =
[[UIAlertViewalloc] initWithTitle:@"提示"message:msg
delegate:nilcancelButtonTitle:nilotherButtonTitles:@"知道了",nil];         
      [al show];            }else{               
[selfpresentPhotoPickerViewControllerWithStyle:LGShowImageTypeImagePicker]; 
          }        }break;case2:        {NSLog(@"取消");       
}break;default:break;    }}#pragma mark *UIActionSheet-
(void)toChoose{UIActionSheet*actionSheet = [[UIActionSheetalloc]         
                       
initWithTitle:nildelegate:selfcancelButtonTitle:@"取
消"destructiveButtonTitle:nilotherButtonTitles:@"相机",@"相册",nil];   
actionSheet.actionSheetStyle =UIActionSheetStyleBlackOpaque;   
[actionSheet showInView:self.parentV.view];}-
(void)createUI{UICollectionViewFlowLayout*flow =
[[UICollectionViewFlowLayoutalloc] init];    _collectionView =
[[UICollectionViewalloc] initWithFrame:self.bounds
collectionViewLayout:flow];//设置代理_collectionView.backgroundColor =
[UIColorwhiteColor];#warning mark 此处需要注意当正式使用的时候需要将边去掉 
我这里是方便测试的时候显示范围_collectionView.layer.borderColor =
[[UIColorredColor]CGColor];    _collectionView.layer.borderWidth =0.5;   
_collectionView.delegate =self;    _collectionView.dataSource
=self;//注册cell和ReusableView(相当于头部)[self.collectionView
registerClass:[imageCellclass]
forCellWithReuseIdentifier:@"DzyImgCell"];   
[selfaddSubview:_collectionView];}-
(NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView{return1;}-
(NSInteger)collectionView:(UICollectionView*)collectionView
numberOfItemsInSection:(NSInteger)section{//------ block
方式漏出图片组供使用if(_DzyImgs) {        _DzyImgs(imageArray);    }//-------
代理方式if(self.dzyImgDelegate && [self.dzyImgDelegate
respondsToSelector:@selector(getImages:)]) {        [self.dzyImgDelegate
getImages:imageArray];    }//这里边设置 的是 点击添加图片按钮  如果没有到最上限 一直限制添加按钮 
否则隐藏掉if(imageArray.count ==self.maxNum) {returnself.maxNum;   
}else{returnimageArray.count+1;    }}-
(UICollectionViewCell*)collectionView:(UICollectionView*)collectionView
cellForItemAtIndexPath:(NSIndexPath*)indexPath{    imageCell *cell =
[collectionView
dequeueReusableCellWithReuseIdentifier:@"DzyImgCell"forIndexPath:indexPath];if(!cell)
{//        NSLog(@"不会进入");}if(indexPath.row == imageArray.count) {//   
    NSLog(@"判断是最后一个 是添加按钮");#warning mark 更改添加按钮背景图片cell.imgView.image =
[UIImageimageNamed:@"plus23.png"];        cell.imgView.contentMode
=UIViewContentModeScaleAspectFit;   
}else{//从相册或者相机选择的图片cell.imgView.image = imageArray[indexPath.row];     
  cell.imgView.contentMode =UIViewContentModeScaleToFill;    }#warning
mark 修改背景颜色cell.imgView.backgroundColor =
[UIColorredColor];returncell;}#pragma mark
--UICollectionViewDelegate//UICollectionView被选中时调用的方法
-(void)collectionView:(UICollectionView*)collectionView
didSelectItemAtIndexPath:(NSIndexPath*)indexPath{if(indexPath.row ==
imageArray.count && indexPath.row

实现代码我就放在github上了Demo有朋友发现可优化更新的部分请联系我

简单集成高大上的ImagePicker无标题文章的更多相关文章

  1. S005SELinux(SEAndroid)的实际文件组成无标题文章

    SEAndroid 是将SELinux 移植到Android 上的产物,可以看成SELinux 辅以一套适用于Android 的策略. 那么在android系统中那些文件是与SELinux(SEAnd ...

  2. 【Android 应用开发】 ActionBar 样式具体解释 -- 样式 主题 简单介绍 Actionbar 的 icon logo 标题 菜单样式改动

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/3926916 ...

  3. android ActionBarActivity设置全屏无标题

    新建的Activity继承自ActionBarActivity,设置全屏无标题本来很简单的事,但是没想到app竟然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时!!! 原因是Actio ...

  4. MFC修改窗口无标题和标题信息,修改执执行文件图标

    一.创建MFC后 窗口显示的是 无标题-工程名 修改方法在网上看到了几种,下面介绍下比较简单的一种: 1.在MianFrame.c文件中找到这个函数 BOOL CMainFrame::PreCreat ...

  5. Android中无标题样式和全屏样式学习

    在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...

  6. 超简单集成华为HMS ML Kit文本识别SDK,一键实现账单号自动录入

    前言   在之前的文章<超简单集成华为HMS Core MLKit通用卡证识别SDK,一键实现各种卡绑定>中我们给大家介绍了华为HMS ML Kit通用卡证识别技术是如何通过拍照自动识别卡 ...

  7. 超简单集成 HMS ML Kit 实现最大脸微笑抓拍

    前言 如果大家对 HMS ML Kit 人脸检测功能有所了解,相信已经动手调用我们提供的接口编写自己的 APP 啦.目前就有小伙伴在调用接口的过程中反馈,不太清楚 HMS ML Kit 文档中的 ML ...

  8. [WPF] 我的WPF自学日记1,无标题窗体拖动

    学习WPF的第一天,尝试写比较常用的功能,无标题窗体拖动. 先在设计界面给它加上MouseDown事件 <Window x:Class="MyFirstWPFAPP.MainWindo ...

  9. windows程序里新窗体不在任务栏显示,无标题拖动,键盘事件,始终显示在主窗体上面,单实例运行等

    不显示在任务栏,Alt+Tab也不显示 protected override CreateParams CreateParams { get { const int WS_EX_APPWINDOW = ...

随机推荐

  1. go语言基础之闭包捕获外部变量特点

    1.闭包捕获外部变量特点 示例: package main //必须 import "fmt" func main() { a := 10 str := "mike&qu ...

  2. java页面url传值中文编码&解码

    URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码. 这将涉及到字符解码操作,我们在应用中常常会用new String(fieldType.ge ...

  3. tcp/ip协议中的SYN, ACK的数值变化

    还需要论述一下seq.ack表示什么意思,应该以什么样的角度去理解这两个序列号. sequence number:表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data st ...

  4. [Algorithm] Construct a Binary Tree and Binary Search

    function createNode(value) { return { value, left: null, right: null }; } function BinaryTree(val) { ...

  5. OpenStack 部署总结之:单节点icehouse网桥的配置

    部署完icehouse,安装完实例之后.假设虚拟主机须要和外部进行通信.还须要对宿主机的网桥进行配置 宿主机的配置 改动ifcfg-em1的内容为下面内容: DEVICE=em1 ONBOOT=yes ...

  6. ie debugger注册码

    次软件是共享软件 也就是需要购买才能使用 囧rz 刚才搜了下竟然有人放出来DebugBar注册码 嘻嘻 我就分享了 对软件作者只能 -_-.say sorry! blog.sina.com.cn/se ...

  7. (笔试题)数组A中任意两个相邻元素大小相差1,在其中查找某个数。

    题目: 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置. 思路: 很明显,在数组中寻找 ...

  8. shell中的字符串操作

    SHELL字符串操作 bash Shell提供了多种字符串处理的命令: awk命令 expr命令 字符串长度 ${#..} expr length awk的length(s) 实例: string=& ...

  9. iOS buttonWithType:101 苹果私有api

    无意中发现,有人创建UIButton这样写 UIButton *previousButton = [UIButtonbuttonWithType:101]; 一看原来是私有api UIButton * ...

  10. es5 - array - shift

    /** * 描述:该shift()方法从数组中删除第一个元素并返回已删除的元素.此方法更改数组的长度. * 语法:arr.shift() * 返回:该shift方法删除零点索引处的元素并将连续索引处的 ...