美文网首页iOS DeveloperiOS 干货整理
iOS中从相册选取多个照片或拍照,可滑动

iOS中从相册选取多个照片或拍照,可滑动

作者: 哈哈大p孩 | 来源:发表于2016-10-25 23:25 被阅读5740次

    这两天项目中需要用户上传多张图片,或者实时拍照,并多个照片排列在一排。倒是花费了我一番时间。现在写在这里。
    先上波图


    展示图.gif

    拍照:


    Paste_Image.png

    在这里要用到github上的一个开源第三方zlphotobrowser,不过这个第三方有很多bug,自己拿来用不是很好使,需要花时间改。

    由于最近工作比较忙,就不一步步解释了,直接将我自己写的代码贴一下
    在ViewController.m中

    #import "ViewController.h"
    #import "UIImage+ZLPhotoLib.h"
    #import "ZLPhoto.h"
    #import "OneTableViewCell.h"
    //#import "UIButton+WebCache.h"
    @interface ViewController ()<UITableViewDelegate, UITableViewDataSource,ZLPhotoPickerBrowserViewControllerDelegate,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
    {
        int MaxPhotos; //照片数量
        //在取消相册之前,记录下当前标记过的照片数量
        NSMutableArray *_biaojiArr;
    }
    @property (nonatomic , strong) UITableView *tableView;
    @property (nonatomic , strong) NSMutableArray *assets;
    @property (nonatomic, strong) NSMutableArray *arr;//拍照数组
    @property (nonatomic, strong) ZLCameraViewController *cameraVc;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        self.view.backgroundColor = [UIColor whiteColor];
        MaxPhotos = 5;
        _biaojiArr = [[NSMutableArray alloc] init];
        [self subTableView];
        
    }
    
    - (void)subTableView {
        _tableView = [[UITableView alloc   ] initWithFrame:self.view.frame];
        _tableView.delegate = self;
        _tableView.dataSource = self;
        [self.view addSubview:_tableView];
    }
    
    - (NSMutableArray *)assets{
        if (!_assets) {
            _assets = [NSMutableArray array];
        }
        return _assets;
    }
    
    - (NSMutableArray *)arr {
        if (!_arr) {
            _arr = [NSMutableArray array];
        }
        return _arr;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 10;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *cellID = @"jiege";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
        }
        
        if (indexPath.row == 2) {
            OneTableViewCell *cell = [[OneTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"one"];
            cell.selectBtn.backgroundColor = [UIColor blueColor];
            [cell.selectBtn addTarget:self action:@selector(diaoyao) forControlEvents:UIControlEventTouchUpInside];
            
            cell.collectionView.showsHorizontalScrollIndicator = NO;
            cell.collectionView.delegate = self;
            cell.collectionView.dataSource = self;
            
            return cell;
        }
        return cell;
    }
    
    - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
        return 1;
    }
    
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
        return self.assets.count;
    }
    
    - ( CGSize )collectionView:( UICollectionView *)collectionView layout:( UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:( NSIndexPath *)indexPath{
        return CGSizeMake ( 60 , 30 );
    }
    
    - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
        return 15;
    }
    
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        
        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellId" forIndexPath:indexPath];
        
        UIImageView *photoView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 60, 30)];
        photoView.backgroundColor = [UIColor yellowColor];
        [cell.contentView addSubview:photoView];
        photoView.tag = indexPath.row+1000;
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapp:)];
        photoView.userInteractionEnabled = YES;
        [photoView addGestureRecognizer:tap];
        
        //创建删除按钮
        UIImageView *deleteView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 5, 5)];
        deleteView.backgroundColor = [UIColor redColor ];
        [photoView addSubview:deleteView];
        deleteView.tag = indexPath.row + 1100;
        UITapGestureRecognizer *detap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapp:)];
        deleteView.userInteractionEnabled = YES;
        [deleteView addGestureRecognizer:detap];
        
        
        NSLog(@"5555555=assets =  %ld", self.assets.count);
        ZLPhotoAssets *asset = self.assets[indexPath.row];
    //    ZLPhotoAssets *asset = _biaojiArr[indexPath.row];
        if ([asset isKindOfClass:[ZLPhotoAssets class]]) {
            photoView.image = asset.originImage;
        }else if ([asset isKindOfClass:[UIImage class]]) {
            photoView.image = (UIImage *)asset;
        }else if ([asset isKindOfClass:[ZLCamera class]]) {
            photoView.image = [(ZLCamera *)asset photoImage];
        }
        
        deleteView.backgroundColor = [UIColor redColor];
        
        return cell;
        
    }
    
    - (void)tapp:(UIGestureRecognizer *)tap {
        int index = (int)[tap view].tag;
        if (index == 1000) {
            //第一个
            NSLog(@"第一个");
            UIImageView *photoView = (UIImageView *)[self.view viewWithTag:index];
            ZLPhotoPickerBrowserViewController *browserVc = [[ZLPhotoPickerBrowserViewController alloc] init];
            [browserVc showHeadPortrait:photoView];
            
        }
        else if (index == 1001) {
            NSLog(@"第二个");
        }
        
        
        if (index == 1100) {
            //第一个差号
            NSLog(@"第一个差号");
            [self.assets removeObjectAtIndex:index % 1100];
            [_tableView reloadData];
        }
        
    }
    
    - (void)handleBtn {
    //    ZLPhotoPickerViewController *pickerVc = [[ZLPhotoPickerViewController alloc] init];
    //    // MaxCount, Default = 9
    //    pickerVc.maxCount = 9;
    //    // Jump AssetsVc
    //    pickerVc.status = PickerViewShowStatusCameraRoll;
    //    // Filter: PickerPhotoStatusAllVideoAndPhotos, PickerPhotoStatusVideos, PickerPhotoStatusPhotos.
    //    pickerVc.photoStatus = PickerPhotoStatusPhotos;
    //    // Recoder Select Assets
    //    pickerVc.selectPickers = self.assets;
    //    // Desc Show Photos, And Suppor Camera
    //    pickerVc.topShowPhotoPicker = YES;
    //    pickerVc.isShowCamera = YES;
    //    // CallBack
    //    pickerVc.callBack = ^(NSArray<ZLPhotoAssets *> *status){
    //        self.assets = status.mutableCopy;
    //        //        [self reloadScrollView];
    //        NSLog(@"提取相册完成,assets == %ld", self.assets.count);
    //        [_tableView reloadData];
    //    };
    //    [pickerVc showPickerVc:self];
        NSLog(@"66666=assets =  %ld", self.assets.count);
    //    _biaojiArr = [NSMutableArray arrayWithArray:self.assets];
        _biaojiArr = [self.assets mutableCopy];
        NSLog(@"_biaoji == %ld", _biaojiArr.count);
        ZLPhotoPickerViewController *pickerVc = [[ZLPhotoPickerViewController alloc] init];
        NSArray *array = [[NSArray alloc] initWithArray:self.assets];
        pickerVc.selectPickers = array;
        pickerVc.maxCount = MaxPhotos;
        
        for (ZLPhotoAssets *photo in array) {
            if ([photo isKindOfClass:[ZLCamera class]]){
                pickerVc.maxCount -= 1;
    //            NSLog(@"333333=assets =  %ld", self.assets.count);
    
            } else if ([photo isKindOfClass:[ZLPhotoAssets class]]) {
                [self.assets removeObject:photo];
    //            NSLog(@"22222=assets =  %ld", self.assets.count);
            }
    //        NSLog(@"1111111=assets =  %ld", self.assets.count);
    
        }
        if (self.assets.count != 0) {
            pickerVc.maxCount = MaxPhotos - self.assets.count;
        }
        
        pickerVc.status = PickerViewShowStatusCameraRoll;
    //    NSLog(@"444444=assets =  %ld", self.assets.count);
        [pickerVc showPickerVc:self];
        
        __weak typeof(self) weakSelf = self;
        pickerVc.callBack = ^(NSArray *assets){
            //        [weakSelf.assert removeAllObjects];
            [weakSelf.assets addObjectsFromArray:assets];
            [weakSelf.tableView reloadData];
        };
        //接受取消观察者信息
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notice:) name:@"tongzhi" object:nil];
    
    }
    
    -(void)notice:(id)sender{
        NSLog(@"%@",sender);
        _assets = [_biaojiArr mutableCopy];
        NSLog(@"_assssss == %ld", _assets.count);
    }
    
    - (void)paizhao {
        //    //判断摄像头是否可用
        //    BOOL isCamera = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];
        //
        //    if (!isCamera) {
        //        NSLog(@"没有摄像头");
        //        return;
        //    }
        //    //初始化图片选择控制器
        //    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
        //    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;//设置通过照相来选取照片
        //
        //    imagePicker.allowsEditing = YES; //设置拍照时的下方的工具栏是否显示,如果需要自定义拍摄界面,则可把该工具栏隐藏
        //    imagePicker.delegate = self;
        //    [self presentViewController:imagePicker animated:YES completion:nil];
        NSLog(@"camera count == %ld", _cameraVc.maxCount);
        NSLog(@"asset == %ld", _assets.count);
        if (_assets.count >= MaxPhotos) {
            NSLog(@"当前照片已经到达上线");
        }
        _cameraVc = [[ZLCameraViewController alloc] init];
        // 拍照最多个数
        _cameraVc.maxCount = MaxPhotos-self.assets.count;
        __weak typeof(self) weakSelf = self;
        _cameraVc.callback = ^(NSArray *cameras){
            for (id object in cameras) {
                [weakSelf.assets addObject:object];
            }
    //        [weakSelf.assets addObjectsFromArray:cameras];
            [weakSelf.tableView reloadData];
        };
        [_cameraVc showPickerVc:self];
        
    }
    - (void)diaoyao {
        //调用相册或者拍照
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"请选择获取图片操作" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
        UIAlertAction *photos = [UIAlertAction actionWithTitle:@"从相册中" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            [self handleBtn];
            
        }];
        UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            
        }];
        
        UIAlertAction *makePhotos = [UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            [self paizhao];
            
        }];
        [alert addAction:photos];
        [alert addAction:makePhotos];
        [alert addAction:cancel];
        
        [self presentViewController:alert animated:YES completion:^{
            
        }];
        
    }
    

    里面用到的collectionView,是我们自定义cell里面的

    static NSString *const cellId = @"cellId";
    static NSString *const headerId = @"headerId";
    static NSString *const footerId = @"footerId";
    - (UICollectionView *)collectionView {
        if (!_collectionView) {
            UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
            [layout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
            _collectionView = [[ UICollectionView alloc ] initWithFrame:CGRectMake(80, 10, self.frame.size.width - 80 , 30) collectionViewLayout :layout];
            _collectionView.backgroundColor = [UIColor whiteColor];
            [_collectionView registerClass :[UICollectionViewCell class ] forCellWithReuseIdentifier : cellId ];
            [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerId];
            [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:footerId];
            
            [self.contentView addSubview:_collectionView];
    
        }
        return _collectionView;
    }
    

    运行后如下:


    测试.gif

    如果你喜欢的话,别忘了点赞,如果帮到了你的话,别忘了请我吃辣条如果你有不懂,可以留言,我有时间会回复的为了更美好的明天,睡觉。

    相关文章

      网友评论

        本文标题:iOS中从相册选取多个照片或拍照,可滑动

        本文链接:https://www.haomeiwen.com/subject/hxcduttx.html