登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

小白也能简单集成高大上的ImagePicker

[复制链接]
来自: Xingefb 分类: iOS精品源码 上传时间: 2016-8-6 12:08:26
Tag:选择器 图片 照相机 image imagepicker

项目介绍:

DzyTest

demo 基于 LGPhoto 和 MLPhotoBrowser 两位大神的代码封装了一下 有助于开发速度 简单几行搞定代码的臃肿 自定义图片选择器 带你装b 带你飞 测试一下牛b的效果吧 相机连拍 图片多选 各种自定义

现在是个项目就要有图片上传所以下面介绍一下简单高端的图片选择器然后看一下实现代码 和效果图对比你就知道绝对可以带你装b带你飞!

实现代码  可选择代理和block 我就直接都写上了 自己选择
[Objective-C] 查看源文件 复制代码
#import "DzyImgPicker.h"

#define DzyWid ([UIScreen mainScreen].bounds.size.width)
#define DzyHei ([UIScreen mainScreen].bounds.size.height)

@interface ViewController () <DzyImgDelegate>
{
    DzyImgPicker *DzyView;
}
@end

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    //从相册返回的话需要刷新下界面
    [DzyView.collectionView reloadData];

}
#pragma - DzyImgDelegate
- (void)getImages:(NSArray *)imgData{
    //此处返回的是选择图片的数组
}
- (void)viewDidLoad {

    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    //此处需要注意  自己计算一下  我设置的每个cell 是60*60  间距10 所以 这里一般是设置 全屏宽度  如有特殊需求自行修改
    DzyView = [[DzyImgPicker alloc] initWithFrame:CGRectMake(0, 160, DzyWid, 200) andParentV:self andMaxNum:9];
    DzyView.dzyImgDelegate = self;
    DzyView.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:DzyView];

    __weak typeof(self)weakSelf = self;
    [DzyView setDzyImgs:^(NSArray *data) {
           //此处返回的是选择图片的数组   
    }];

    // Do any additional setup after loading the view.
}


直接上代码看一下封装过程 DzyImgPicker.h
[Objective-C] 查看源文件 复制代码
#import <UIKit/UIKit.h>

@protocol  DzyImgDelegate <NSObject>
//代理方式返回数组
- (void)getImages:(NSArray *)imgData;

@end

@interface DzyImgPicker : 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> dzyImgDelegate;

@end


DzyImgPicker.m
[Objective-C] 查看源文件 复制代码
#import "DzyImgPicker.h"

#import "LGPhoto.h"
#import "MLPhotoBrowserViewController.h"
#import "imageCell.h"

@interface DzyImgPicker ()<UIActionSheetDelegate,LGPhotoPickerViewControllerDelegate,UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,MLPhotoBrowserViewControllerDataSource,MLPhotoBrowserViewControllerDelegate>

{
    //存储图片
    NSMutableArray *imageArray;

}
//最大的图片张数
@property (nonatomic ) NSInteger maxNum;
//父类的view
@property (nonatomic ) UIViewController *parentV;

@property (nonatomic, assign) LGShowImageType showType;

@end

@implementation DzyImgPicker

#pragma mark - <MLPhotoPickerBrowserViewControllerDataSource>
- (NSInteger) numberOfSectionInPhotosInPhotoBrowser:(MLPhotoBrowserViewController *)photoBrowser{
    return 1;
}
- (NSInteger) photoBrowser:(MLPhotoBrowserViewController *)photoBrowser numberOfItemsInSection:(NSUInteger)section{

    return imageArray.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;
    return photo;
}
#pragma mark - <MLPhotoPickerBrowserViewControllerDelegate>
#pragma mark 删除照片调用
- (void)photoBrowser:(MLPhotoBrowserViewController *)photoBrowser removePhotoAtIndexPath:(NSIndexPath *)indexPat
{
    if (indexPat.row > [imageArray count]) return;
    [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;
    // delegate
    photoBrowser.delegate = self;
    // 数据源
    photoBrowser.dataSource = self;
    // 当前选中的值
    photoBrowser.currentIndexPath = [NSIndexPath indexPathForItem: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 *canamer in cameras) {

            [imageArray addObject:canamer.photoImage];
        }

        NSLog(@"%lu",(unsigned long)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 = [NSMutableArray array];

    for (LGPhotoAssets *photo in assets) {
        //原图
        [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{

    switch (buttonIndex) {
        case 0:
        {
            NSLog(@"相机");

            if (self.maxNum-imageArray.count == 0) {
                UIAlertView *al = [[UIAlertView alloc] initWithTitle:@"提示" message:@"选取图片最大为9张!" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"知道了", nil];

                [al show];
            }else{
                [self presentCameraContinuous];
            }

        }
            break;
        case 1:
        {
            NSLog(@"相册");
            if (self.maxNum-imageArray.count == 0) {
                UIAlertView *al = [[UIAlertView alloc] initWithTitle:@"提示" message:@"选取图片最大为9张!" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"知道了", nil];

                [al show];
            }else{
                [self presentPhotoPickerViewControllerWithStyle:LGShowImageTypeImagePicker];

            }
        }
            break;
        case 2:
        {
            NSLog(@"取消");

        }
            break;
        default:
            break;
    }


}
#pragma mark *UIActionSheet
- (void)toChoose{

    UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                  initWithTitle:nil
                                  delegate:self
                                  cancelButtonTitle:@"取消"
                                  destructiveButtonTitle:nil
                                  otherButtonTitles:@"相机", @"相册",nil];
    actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    [actionSheet showInView:self.parentV.view];

}


- (void)createUI{

    UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
    _collectionView = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:flow];
    //设置代理
    _collectionView.backgroundColor = [UIColor whiteColor];
#warning mark 此处需要注意当正式使用的时候需要将边去掉   我这里是方便测试的时候显示范围
    _collectionView.layer.borderColor = [[UIColor redColor] CGColor];
    _collectionView.layer.borderWidth = 0.5;

    _collectionView.delegate = self;
    _collectionView.dataSource = self;
    //注册cell和ReusableView(相当于头部)
    [self.collectionView registerClass:[imageCell class] forCellWithReuseIdentifier:@"DzyImgCell"];

    [self addSubview:_collectionView];

}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}

- (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) {
        return  self.maxNum;
    }else{
        return imageArray.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 = [UIImage imageNamed:@"plus23.png"];
        cell.imgView.contentMode = UIViewContentModeScaleAspectFit;

    }else{
        //从相册或者相机选择的图片
        cell.imgView.image = imageArray[indexPath.row];
        cell.imgView.contentMode = UIViewContentModeScaleToFill;

    }
#warning mark 修改背景颜色
    cell.imgView.backgroundColor = [UIColor redColor];
    return cell;
}

#pragma mark --UICollectionViewDelegate
//UICollectionView被选中时调用的方法
-( void )collectionView:( UICollectionView *)collectionView didSelectItemAtIndexPath:( NSIndexPath *)indexPath
{

    if (indexPath.row == imageArray.count && indexPath.row < self.maxNum) {
        NSLog(@"最后一个的话是添加按钮然后弹出选择键 选择图片的方式");
        [self toChoose];
    }else{
        imageCell * cell = (imageCell *)[collectionView cellForItemAtIndexPath :indexPath];
        //是图片的话配置浏览 和删除模式
        [self setupPhotoBrowser:cell];

    }

}

//返回这个UICollectionViewCell是否可以被选择  ***  设置之前的隐藏后 此方法可不设置
-( BOOL )collectionView:( UICollectionView *)collectionView shouldSelectItemAtIndexPath:( NSIndexPath *)indexPath
{
    if (indexPath.row == self.maxNum) {
        return NO;
    }else{
        return YES;
    }
}

#pragma mark - UICollectionViewDelegateFlowLayout
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
    return CGSizeZero;
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section{
    return CGSizeZero;
}
//定义每个UICollectionView 的大小
- ( CGSize )collectionView:( UICollectionView *)collectionView layout:( UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:( NSIndexPath *)indexPath
{
    return CGSizeMake (60,60);
}
//定义每个UICollectionView 的边距
-( UIEdgeInsets )collectionView:( UICollectionView *)collectionView layout:( UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:( NSInteger )section

{

    return UIEdgeInsetsMake (10,10,10,10);

}

- (instancetype)initWithFrame:(CGRect)frame andParentV:(UIViewController *)parentV andMaxNum:(NSInteger )maxNum{

    if (self == [super initWithFrame:frame]) {

        imageArray = [NSMutableArray array];
        self.parentV = parentV;
        self.maxNum = maxNum;
        [self createUI];

    }
    return self;
}


@end


文/践行丶见远(简书作者)


DEMO 直接下载:



相关源码推荐:

我来说两句
*滑动验证:
所有评论(650)
zhongqi668 2016-8-8 11:56:44
楼主威武啊,Code4App有你更给力!
回复
wufer 2016-8-8 13:27:32
感谢分享,Code4App有你更精彩
回复
小李子nil 2016-8-8 13:54:27
楼主用心了,内容非常精彩。
回复
小李子nil 2016-8-8 13:54:34
精华内容,楼主V5!
回复
小李子nil 2016-8-8 13:55:03
虽不明,但觉厉!
回复
ZSilence 2016-8-8 15:15:29
强大!!!赞楼主
回复
qlbk0613 2016-8-8 15:34:07
精华内容,楼主V5!
回复
18508421145 2016-8-8 16:03:02
正需要啊,感谢楼主无私分享!
回复
18508421145 2016-8-8 16:03:48
虽不明,但觉厉!
回复
提取码:  下载次数:587 状态:已购或VIP 售价:0(原价:10)金钱 下载权限:初级码农 
5223 2 587
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表