做APP基本上都是需要从系统的相册当中获取一张或多张图片。那怎么做呢?下面我就带你来实现这个内容,第一次写。 我只是记录一下。如有写错,还请各位大神指点一二 ;
想要使用类似微信的相册功能,就必须导入框架 TZImagePickerController 。(星星特别多哈。。。。)
去 https://github.com 网站 搜索 TZImagePickerController 进行下载。 也可以使用cocoa pods进行下载。 如果你没有安装cocoa pods那我就推荐http://blog.csdn.net/jhy835239104/article/details/52655122 这篇文章,个人觉得还是很不错的。需要的朋友可以参考;
好啦,废话不多说;直接上代码;
在控制器当中添加一个UIView 和 collectionView.collectionView用来显示图片(看你需要,那就怎么添加)
-(void)choosePickViewController{
//创建view,添加到系统的view上面
UIView *btnView = [[UIView alloc]init];
btnView.frame = CGRectMake(0, self.textV.ymt_height, self.view.bounds.size.width,50);
btnView.backgroundColor = [UIColor colorWithRed:232/255.0 green:233/255.0 blue:234/255.0 alpha:1];
self.btnView = btnView;
[self.view addSubview:btnView];
//我需要点击创下面的Btn按钮来跳转相册
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:[UIImage imageNamed:@"buyon_image"] forState:UIControlStateNormal];
btn.frame = CGRectMake(25,5, 40 , 40);
[btn addTarget:self action:@selector(choosePhoto) forControlEvents:UIControlEventTouchUpInside];
[self.btnView addSubview:btn];
//创建collection来装饰
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
CGFloat margin = 5; //间距
CGFloat itemWH = (self.view.ymt_width - 4 * margin) / 3 -margin;
layout.itemSize = CGSizeMake(itemWH, itemWH);
layout.minimumInteritemSpacing = margin;
layout.minimumLineSpacing = margin;
layout.sectionInset = UIEdgeInsetsMake(5, 10, 5, 10);
UICollectionView *collection = [[UICollectionView alloc]initWithFrame:CGRectMake(0, self.textV.ymt_height + self.btnView.ymt_height , LZQScreenW, LZQScreenH - self.textV.ymt_height - self.btnView.ymt_height) collectionViewLayout:layout
];
collection.backgroundColor = [UIColor colorWithRed:245/255.0 green:240/255.0 blue:245/255.0 alpha:1];
collection.delegate = self;
collection.dataSource = self;
collection.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.collection = collection;
[self.view addSubview:collection];
[self.collection registerClass:[YMTShoppingViewCell class] forCellWithReuseIdentifier:shoppingID ];
}
注意 ,,,想要访问相册必须要到项目的info.plist 中添加访问权限,
- 这里写图片描述
首先需要导入框架头文件
import <TZImagePickerController/TZImagePickerController.h>
//参数介绍: MaxImagesCount: 最多选择多少张图片 columnNumber :最少选择几张
delegate:设置代理并遵守协议 《 TZImagePickerControllerDelegate》
在监听按钮的点击的方法中
-(void)choosePhoto {
TZImagePickerController *imagePick = [[TZImagePickerController alloc]initWithMaxImagesCount:9 columnNumber:0 delegate:self pushPhotoPickerVc:YES];
在这个回调函数中获得图片 和 图片的名称 但是个人不推荐在这里拿。下面还是可以拿的到的。因为这里有肯能拿不到图片,
[imagePick setDidFinishPickingPhotosHandle:^(NSArray<UIImage *> *photo, NSArray *asset, BOOL isSelectOriginalPhoto) {
NSLong(@"什么也不做");
}];
//弹出相册
[self presentViewController:imagePick animated:YES completion:nil];
}
//当相片选取完成之后回来到这个函数
//完成后获取图片
‘ - (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto {
//self.photoArr 保存图片的数组
// self.asseTArr 保存图片名称的数组
self.photoArr = photos;
self.asseTArr = assets;
//在此强调一声,我们的图片上传流程是先把图片上传至服务器,然后服务器返回给我一个url,我再把这个url当成图片的参数上传只服务器,这样才能识别; 所以不知道大家的流程是什么样的,我就把我的流程写出来;
// 首先获取服务器返回的url。就在下面写出来了
[self getImageUrl];
//刷新collection,显示图片
[self.collection reloadData];
}
‘
pragma mark ======== 获取服务器返回的url ========
-(void)getImageUrl {
[self.ImageURLArr removeAllObjects];
//遍历保存图片的数组;
for (UIImage *image in self.photoArr) {
//使用AFN的post请求
[self.manager POST:@"http://baidu.lllll/App/upload.php" parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//将图片装换成二进制数据。看你的图片是什么格式,苹果一般都是JPEG. 下面的image就是遍历出来的图片,后面的参数是缩放图片的比例,如果你的图片过大,服务器是不接收的;
NSData *data = UIImageJPEGRepresentation(image, 0.5);
/*参数介绍:
FileData: 二进制图片
name: 图片可以什么名称上传
fileName: 服务器用什么名称的文件接收
mimeType:图片的类型,无非两种,jpeg 和 png 也可百度查查
*/
[formData appendPartWithFileData:data name:@"pic" fileName:@"123.JPEG" mimeType:@"image/jpeg"];
} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//当发送成功之后就返回图片的url,解析获取;转模型
_shopModel = [YMTShopModelURL mj_objectWithKeyValues:responseObject];
//这是保存服务器返回图片url 的数组;
[self.ImageURLArr addObject:_shopModel.url];
//最后在刷新collectionView。图片就会显示上去
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"上传失败------%@",error);
}];
}
}
2.上传就差不多了;有什么疑问可以留言,我能解决的会尽量帮;demo暂时没有; 我的这个其实挺简单;只是自己看框架的时候看的头都疼了,里面的方法多不说,还需要上传视屏和音频; 后期有时间也会去研究并写出来;写的不好请指教;