iOS - 调用相机连续拍照

246 阅读2分钟

跟朋友讨论如题中的功能怎么实现,后来用系统的方法实现了这一功能,说起来有点取巧,就是在确定拍照后的图片后重新进入相机界面,前面我发过一篇Object-C的和Swift的上传头像,以这个为基础实现,具体做法是在,选中一张图片后的代理中:

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

在以下方法中:

        //表单请求,上传文件
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        manager.requestSerializer = [AFJSONRequestSerializer serializer];//请求
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];//响应
        manager.requestSerializer.timeoutInterval = 8;
        /*
         *这里需要特别注意一下,因为没有放具体的上传地址,所以这个上传方式是不成功的,但是方法是没错的,需要替换成正确的上传地址
         */
        [manager POST:[NSString stringWithFormat:@"url"] parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            //将图片以表单形式上传
            NSData *data1=[NSData dataWithContentsOfFile:filePath];
            [formData appendPartWithFileData:data1 name:@"headPicFile" fileName:@"headPicFile" mimeType:@"image/png"];

            //关闭相册界面
            [UIView animateWithDuration:0.001 animations:^{
                [picker dismissViewControllerAnimated:NO completion:nil];
            } completion:^(BOOL finished){
                //重新打开相机
                [self presentViewController:picker animated:YES completion:nil];
            }];


        }progress:^(NSProgress *uploadProgress){


        }success:^(NSURLSessionDataTask *task, id responseObject) {
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
            NSLog(@"dic:%@",dic);
            //成功后替换新头像
            NSData *data1=[NSData dataWithContentsOfFile:filePath];
            headImageView.image = [UIImage imageWithData:data1];

        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            NSLog(@"%@",[error description]);
            NSLog(@"%@",error);
            //因为没有有效地址,所以肯定是上传失败的,为了表现出效果,此处也替换为新头像
            NSData *data1=[NSData dataWithContentsOfFile:filePath];
            headImageView.image = [UIImage imageWithData:data1];
        }];

主要是这个方法:

            //关闭相册界面
            [UIView animateWithDuration:0.001 animations:^{
                [picker dismissViewControllerAnimated:NO completion:nil];
            } completion:^(BOOL finished){
                //重新打开相机
                [self presentViewController:picker animated:YES completion:nil];
            }];

用UIView的过渡方法,这个过渡方法在Core Animation中也有介绍过,尤其注意要把present和dismiss的跳转里面的动画设置为NO,否则你设置的时间是无效的,重新打开相机可酌情给YES,具体效果,可以自己动手尝试。
另外picker.allowsEditing根据需要设置,意思是拍照后显示刚拍的图片,可进行编辑,为NO时不显示。

最后再说一句,要想得到多张图片且统一上传,就不要把关闭相机和重新打开的代码放在AF中,因为是直接上传的,要拿到图片请设置全局变量根据是否选择图片来获取当前拍摄的图片并存储。最后统一上传。