info.plist
文件中添加两个key用来询问用户是否同意访问相机相册,这里调用相机是系统自带的,默认提示都为英文,可以修改英文标题为中文,如cancel换为取消等,也需要在info.plist
文件中配置。Privacy - Photo Library Usage Description
Privacy - Camera Usage Description
Localization native development region
设置为China.
Localized resources can be mixed
为YES
,表示允许应用程序获取框架库内语言Privacy - Photo Library Additions Usage Description
UIImagePickerController
, 然后设置其sourceType
属性来判断是打开相机还是相册还是图片库:UIImagePickerControllerSourceTypePhotoLibrary
,UIImagePickerControllerSourceTypeCamera
,UIImagePickerControllerSourceTypeSavedPhotosAlbum
访问相机相册:
- (void)rightBtnClick{
UIAlertController * alertC = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
__weak typeof(self)weakSelf = self;
UIAlertAction * cameraAlert = [UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){
//判断是否能够打开相机
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
//此应用程序没有被授权访问的照片数据。可能是家长控制权限 或者 用户已经明确否认了这一照片数据的应用程序访问
if (status == AVAuthorizationStatusRestricted || status ==AVAuthorizationStatusDenied ) {
[weakSelf showSelectMessgae:@"请设置允许访问相机"];
}else{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
UIImagePickerController * imagePickerC = [[UIImagePickerController alloc]init];
//设置资源类型为相机
imagePickerC.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerC.delegate = self;
[weakSelf presentViewController:imagePickerC animated:YES completion:nil];
}else{
NSLog(@"手机不支持拍照");
}
}
}];
UIAlertAction * photoLibraryAlert = [UIAlertAction actionWithTitle:@"从手机相册选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//判断系统版本
if ([UIDevice currentDevice].systemVersion.doubleValue >= 9.0) {
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied){
[weakSelf showSelectMessgae:@"请设置允许访问相册"];
}else{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
UIImagePickerController * imagePickerC = [[UIImagePickerController alloc]init];
//设置资源类型为图片资源库
imagePickerC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePickerC.delegate = self;
[weakSelf presentViewController:imagePickerC animated:YES completion:nil];
}else{
}
}
}else{
//9.0以后过期
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
if (status == kCLAuthorizationStatusRestricted || status == AVAuthorizationStatusDenied){
[weakSelf showSelectMessgae:@"请设置允许访问相册"];
}else{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
UIImagePickerController * imagePickerC = [[UIImagePickerController alloc]init];
//设置资源类型为图片资源库
imagePickerC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePickerC.showsCameraControls = NO;
imagePickerC.delegate = self;
[weakSelf presentViewController:imagePickerC animated:YES completion:nil];
}else{
NSLog(@"手机不支持相册");
}
}
}
}];
UIAlertAction * cancelAlert = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertC addAction:cameraAlert];
[alertC addAction:photoLibraryAlert];
[alertC addAction:cancelAlert];
[self presentViewController:alertC animated:YES completion:nil];
}
- (void)showSelectMessgae:(NSString *)message{
UIAlertController * alertC = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction * action = [UIAlertAction actionWithTitle:@"去设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication]canOpenURL:url]) {
[[UIApplication sharedApplication]openURL:url];
}
}];
UIAlertAction * cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertC addAction:action];
[alertC addAction:cancel];
[self presentViewController:alertC animated:YES completion:nil];
}
UIImagePickerController
的代理方法,但要遵守两个协议UIImagePickerControllerDelegate
、UINavigationControllerDelegate
。1.拍完照片,选择照片或者从图片库中选择照片后调用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
2.取消时调用
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
3.保存照片时调用
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void *)contextInfo
实现代理方法
#pragma mark UIImagePickerControllerDelegate
//拍完照片,选择照片或者从图片库中选择照片后调用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
__weak typeof(self)weakSelf = self;
[picker dismissViewControllerAnimated:YES completion:^{
UIImage * loadImage = [info valueForKey:UIImagePickerControllerOriginalImage];//获得原始图片
//高保真压缩图片,可以压缩图片但是图片质量基本没有损失,第二个参数即图片质量参数
self.iamgeData = UIImageJPEGRepresentation(loadImage, 0.3);
weakSelf.upFileType = @"jpeg";
NSDateFormatter * dfm = [[NSDateFormatter alloc]init];
dfm.dateFormat = @"yyyyMMddHHmmsssss";
weakSelf.upFileName = [NSString stringWithFormat:@"%@_%@.%@",self.flowId,[dfm stringFromDate:[NSDate date]],weakSelf.upFileType];
//上传到服务器
[weakSelf upLoadPhoto];
}];
}
//取消时调用
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[picker dismissViewControllerAnimated:YES completion:nil];
printf("取消");
}
//保存到相册
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
if (error != nil) {
UIAlertView *fail = [[UIAlertView alloc]initWithTitle:@"提示" message:@"保存失败" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[fail show];
NSLog(@"%@",error);
}
else{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:@"保存成功" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alert show];
[self.view addSubview:alert];
}
}
图片上传成功保存到本地缓存
//上传照片到服务器
- (void)upLoadPhoto{
NSMutableDictionary * parameters = [NSMutableDictionary dictionary];
[parameters setValue:[LoginUser shareLoginUser].loginId forKey:@"loginId"];
[parameters setValue:[LoginUser shareLoginUser].orgNo forKey:@"orgNo"];
[parameters setValue:self.flowId forKey:@"flowId"];
[parameters setValue:self.upFileType forKey:@"upFileType"];
[parameters setValue:self.upFileName forKey:@"upFileName"];
NSMutableDictionary * dict = [NSMutableDictionary dictionary];
[dict setValue:self.iamgeData forKey:@"upFile"];
[dict setValue:@"upFile" forKey:@"name"];
[dict setValue:self.upFileName forKey:@"upFileName"];
[dict setValue:[NSString stringWithFormat:@"image/%@",self.upFileType] forKey:@"upFileType"];
NSArray* fileArray = [NSArray arrayWithObject:dict];
__weak typeof(self)weakSelf = self;
[[IDataHttpRequest sharedRequest]upLoadFileWithUrlStr:@"actionSh/Order!commitImages.action" parameters:parameters andFileArray:fileArray andDataKey:@"upFile" nameKey:@"name" fileNameKey:@"upFileName" mimeTypeKey:@"upFileType" isShowRequestAnimation:YES success:^(NSDictionary *returnDic) {
//上传成功后保存到本地数组中
NSMutableDictionary * dic = [NSMutableDictionary dictionary];
UIImage * image = [UIImage imageWithData:weakSelf.iamgeData];
[dic setValue:image forKey:IMAGE];
[dic setValue:weakSelf.upFileName forKey:IMAGENAME];
[weakSelf.dataSource addObject:dic];
//保存到本地缓存
BOOL isSuccess = [weakSelf.iamgeData writeToFile:[weakSelf filePathWithIamgeName:weakSelf.upFileName] atomically:YES];
//刷新collectionView
[weakSelf.collectionView reloadData];
} error:^(NSString *msg) {
}];
}
创建缓存路径
- (NSString *)filePathWithIamgeName:(NSString *)imageName{
//NSCachesDirectory,NSDocumentDirectory
//获取缓存路
NSString * cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
//在缓存路径后面拼接保存图片的文件夹路劲
NSString * filePath = [cachePath stringByAppendingPathComponent:@"OrederImage"];
//如果该文件夹路径不存在就创建该文件夹
if (![[NSFileManager defaultManager]fileExistsAtPath:filePath]) {
[[NSFileManager defaultManager]createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
}
DLog(@"imagePath : %@",[filePath stringByAppendingPathComponent:imageName]);
//如果用图片就返回图片路径,没有就返回保存图片文件夹路径
if (imageName) return [filePath stringByAppendingPathComponent:imageName];
else return filePath;
}
九宫格展示图片
//创建流水布局
UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc] init];
//设置每个item的size
layout.itemSize = CGSizeMake(ITEMWITH, ITEMWITH);
//初始化collectionView
self.collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(10, CGRectGetMaxY(lineV.frame)+5, self.view.bounds.size.width - 20, self.view.bounds.size.height - CGRectGetMaxY(lineV.frame)-5) collectionViewLayout: layout];
self.collectionView.dataSource = self;
self.collectionView.delegate = self;
self.collectionView.backgroundColor = [UIColor whiteColor];
//这里用的是xib,需要注册一下id
[self.collectionView registerNib:[UINib nibWithNibName:@"AlbumCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"AlbumCollectionViewCELL"];
[self.view addSubview:self.collectionView];
实现数据源和代理方法
#pragma mark UICollectionViewDataSourceAndUICollectionViewDelegate
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return self.dataSource.count;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
AlbumCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"AlbumCollectionViewCELL" forIndexPath:indexPath];
NSDictionary * dict = self.dataSource[indexPath.row];
//如果本地缓存中有就去缓存中获取图片
if ([self.dataSource[indexPath.row] valueForKey:IMAGE]) {
cell.imageV.image = [dict valueForKey:IMAGE];
}else{
//没有就去服务器中下载图片
cell.imageV.image = self.placeholderImage;
[self requestImageWithIndex:indexPath];
}
return cell;
}
//这个是两行cell之间的间距(上下行cell的间距)
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
return 10;
}
//两个cell之间的间距(同一行的cell的间距)
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
return 10;
}
点击展示原图
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"%@",indexPath);
NSMutableArray * imageArr = [NSMutableArray array];
for (NSDictionary * dic in self.dataSource) {
if ([dic valueForKey:@"image"]) {
[imageArr addObject:[dic valueForKey:@"image"]];
}
}
if (imageArr.count<self.dataSource.count)return;
ShowBigPhotoViewController * showbigVC = [[ShowBigPhotoViewController alloc]init];
//设置要展示的照片数据源
showbigVC.imageArray = imageArr;
//选中的是第几张照片,默认展示第几张,便于左右滑动时展示前后的照片
showbigVC.index = indexPath.row;
showbigVC.delegate = self;
//是否能够删除(是否有删除按钮)
showbigVC.isCanDelete = self.isUpload;
[self presentViewController:showbigVC animated:YES completion:nil];
}
展示大图
#import "ShowBigPhotoViewController.h"
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor];
[self.view addSubview:self.backBtn];
if (self.isCanDelete) {
[self.view addSubview:self.deleteBtn];
}
[self.view addSubview:self.scrollV];
//设置contentSize的宽度为scrollV宽度乘照片张数减去一个间距10(不减去10最后一张往右边滑动时会出现间距)
self.scrollV.contentSize = CGSizeMake(self.scrollV.bounds.size.width * self.imageArray.count - GAP, self.scrollV.bounds.size.height);
//遍历图片数组设置展示照片
for (int i = 0; i < self.imageArray.count; i++) {
UIImage * image = self.imageArray[i];
//宽度为屏幕宽度,高度为图片宽高比计算
CGFloat height = self.scrollV.bounds.size.width * (image.size.height/image.size.width);
UIImageView * iamgev = [[UIImageView alloc]initWithFrame:CGRectMake(i * self.scrollV.bounds.size.width, 0, IMGAEWIDTH, height)];
iamgev.image = image;
[self.scrollV addSubview:iamgev];
}
//设置偏移量展示点击过的照片
[self.scrollV setContentOffset:CGPointMake(self.index * self.scrollV.bounds.size.width , 0) animated:YES];
}
-(UIScrollView *)scrollV{
if (!_scrollV) {
//_scrollV宽度为屏幕宽度加上间距是为了分页
_scrollV = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 60, IMGAEWIDTH + GAP, self.view.bounds.size.height - 60)];
_scrollV.pagingEnabled = YES;
_scrollV.showsVerticalScrollIndicator = NO;
_scrollV.showsHorizontalScrollIndicator = NO;
_scrollV.delegate = self;
_scrollV.bounces = NO;
// _scrollV.clipsToBounds = NO;
}
return _scrollV;
}
删除图片
//删除照片需要去服务器中把改图片删除
- (void)deletePhotoWithIndex:(NSInteger)index{
NSMutableDictionary * parameters = [NSMutableDictionary dictionary];
[parameters setValue:[LoginUser shareLoginUser].loginId forKey:@"loginId"];
[parameters setValue:[LoginUser shareLoginUser].orgNo forKey:@"orgNo"];
[parameters setValue:self.flowId forKey:@"flowId"];
NSDictionary * dict = self.dataSource[index];
[parameters setValue:[dict valueForKey:IMAGENAME] forKey:@"upFileName"];
__weak typeof(self)weakSelf = self;
__block typeof(dict)blockDict = dict;
[[IDataHttpRequest sharedRequest]requestDataWithUrlStr:@"actionSh/Order!deleteImages.action" parameters:parameters isShowRequestAnimation:YES success:^(NSDictionary *returnDic){
//删除成功就给个提示
UIAlertController * alertC = [UIAlertController alertControllerWithTitle:@"提示" message:[returnDic valueForKeyPath:@"state.msg"] preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction * cancel = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:nil];
[alertC addAction:cancel];
[weakSelf presentViewController:alertC animated:YES completion:nil];
NSString * imagename = [blockDict valueForKey:IMAGENAME];
//本地缓存中也删除
if ([[NSFileManager defaultManager]fileExistsAtPath:[weakSelf filePathWithIamgeName:imagename]]) {
[[NSFileManager defaultManager]removeItemAtPath:[weakSelf filePathWithIamgeName:imagename] error:nil];
}
[weakSelf.dataSource removeObjectAtIndex:index];
[weakSelf.collectionView reloadData];
} error:^(NSString *msg) {
}];
}
请求照片并且本地做缓存
//请求图片
- (void)requestData{
//获取本地图片缓存大小,超过50M就清空缓存
CGFloat CacheSize = [self readCacheSize];
DLog(@"缓存:%lf M",CacheSize);
if (CacheSize > 50) {
[self clearFile];
}
NSMutableDictionary * parameters = [NSMutableDictionary dictionary];
[parameters setValue:[LoginUser shareLoginUser].loginId forKey:@"loginId"];
[parameters setValue:[LoginUser shareLoginUser].orgNo forKey:@"orgNo"];
[parameters setValue:self.flowId forKey:@"flowId"];
[[IDataHttpRequest sharedRequest]requestDataWithUrlStr:@"actionSh/Order!getImgList.action" parameters:parameters isShowRequestAnimation:YES success:^(NSDictionary *returnDic) {
NSArray * array = [returnDic valueForKey:@"imgList"];
for (NSDictionary * dict in array) {
NSMutableDictionary * dic = [NSMutableDictionary dictionary];
[dic setValue:[dict valueForKey:IMAGEURL] forKey:IMAGEURL];
[dic setValue:[dict valueForKey:@"fileName"] forKey:IMAGENAME];
//通过图片名称判断本地缓存中又没改图片,有就从本地读缓存文件
if ([[NSFileManager defaultManager] fileExistsAtPath:[self filePathWithIamgeName:[dic valueForKey:IMAGENAME]]]) {
NSData * imageData = [NSData dataWithContentsOfFile:[self filePathWithIamgeName:[dic valueForKey:IMAGENAME]]];
UIImage * image = [UIImage imageWithData:imageData];
if (image) {
[dic setValue:image forKey:IMAGE];
}
}
[self.dataSource addObject:dic];
}
[self.collectionView reloadData];
} error:^(NSString *msg) {
}];
}
计算缓存大小
//1. 获取缓存文件的大小
-(float)readCacheSize{
NSString *cachePath = [self filePathWithIamgeName:nil];
return [ self folderSizeAtPath :cachePath];
}
//2.遍历文件夹获得文件夹大小,返回多少 M
- (float) folderSizeAtPath:( NSString *) folderPath{
NSFileManager * manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath :folderPath]) return 0 ;
NSEnumerator *childFilesEnumerator = [[manager subpathsAtPath :folderPath] objectEnumerator];
NSString * fileName;
long long folderSize = 0 ;
while ((fileName = [childFilesEnumerator nextObject]) != nil ){
//获取文件全路径
NSString * fileAbsolutePath = [folderPath stringByAppendingPathComponent :fileName];
folderSize += [ self fileSizeAtPath :fileAbsolutePath];
}
return folderSize/( 1024.0 * 1024.0);
}
//3.计算单个文件的大小
- (long long) fileSizeAtPath:( NSString *) filePath{
NSFileManager * manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath :filePath]){
return [[manager attributesOfItemAtPath :filePath error : nil] fileSize];
}
return 0;
}
清除缓存
- (void)clearFile
{
NSString * cachePath = [self filePathWithIamgeName:nil];//[NSSearchPathForDirectoriesInDomains (NSCachesDirectory , NSUserDomainMask , YES ) firstObject];
NSArray * files = [[NSFileManager defaultManager ] subpathsAtPath :cachePath];
//NSLog ( @"cachpath = %@" , cachePath);
for ( NSString * p in files) {
NSError * error = nil ;
//获取文件全路径
NSString * fileAbsolutePath = [cachePath stringByAppendingPathComponent :p];
if ([[NSFileManager defaultManager ] fileExistsAtPath :fileAbsolutePath]) {
[[NSFileManager defaultManager ] removeItemAtPath :fileAbsolutePath error :&error];
}
}
}
#照片多选上传及展示
TZImagePickerController
框架,初始化TZImagePickerController
控制器,设置相关属性,如果用代理方法获取返回的图片等信息,还要遵守TZImagePickerControllerDelegate
协议,实现- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto
代理方法,也可以用block;//当从图片资源库中获取数据时
UIAlertAction * photoLibraryAlert = [UIAlertAction actionWithTitle:@"从手机相册选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//判断系统版本
if ([UIDevice currentDevice].systemVersion.doubleValue >= 9.0) {
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied){
[weakSelf showSelectMessgae:@"请设置允许访问相册"];
}else{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
//最大可选五张,每行显示三张照片
TZImagePickerController *imagePick = [[TZImagePickerController alloc]initWithMaxImagesCount:5 columnNumber:3 delegate:self pushPhotoPickerVc:YES];
imagePick.allowPreview = NO;//影藏预览按钮
imagePick.showSelectedIndex = YES;//显示照片中的选中编号
imagePick.showPhotoCannotSelectLayer = YES;//添加覆盖层
imagePick.allowPickingVideo = NO;//不能选择视频
imagePick.allowTakePicture = NO;//影藏内包拍照按钮
imagePick.preferredLanguage = @"zh-Hans";//设置语言无为汉语简体
[weakSelf presentViewController:imagePick animated:YES completion:nil];
}else{
NSLog(@"没有设置访问权限");
}
}
}else{//iOS9.0以前
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
if (status == kCLAuthorizationStatusRestricted || status == AVAuthorizationStatusDenied){
[weakSelf showSelectMessgae:@"请设置允许访问相册"];
}else{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
TZImagePickerController *imagePick = [[TZImagePickerController alloc]initWithMaxImagesCount:5 columnNumber:3 delegate:self pushPhotoPickerVc:YES];
imagePick.allowPreview = NO;//影藏预览按钮
imagePick.showSelectedIndex = YES;//显示照片中的选中编号
imagePick.showPhotoCannotSelectLayer = YES;//添加覆盖层
imagePick.allowPickingVideo = NO;//不能选择视频
imagePick.allowTakePicture = NO;//影藏内包拍照按钮
imagePick.preferredLanguage = @"zh-Hans";//设置语言无为汉语简体
[weakSelf presentViewController:imagePick animated:YES completion:nil];
}else{
NSLog(@"手机不支持相册");
}
}
}
}];
实现代理方法:
# pragma mark TZImagePickerControllerDelegate
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto{
if (photos){
//photos:返回选中的图片数组
//assets:返回返回图片信息的数组
//isSelectOriginalPhoto:返回的是否是原图
self.photoFileArray = [NSMutableArray array];
for (int i = 0; i < photos.count; i++) {
NSMutableDictionary * dict = [NSMutableDictionary dictionary];
UIImage * iamge = photos[i];
NSData * iamgeData;
if (isSelectOriginalPhoto)
iamgeData = UIImageJPEGRepresentation(iamge, 0.2);
else
iamgeData = UIImageJPEGRepresentation(iamge, 0.5);
//图片数据
[dict setValue:iamgeData forKey:@"data"];
[dict setValue:@"upFile" forKey:@"name"];
NSDateFormatter * dfm = [[NSDateFormatter alloc]init];
dfm.dateFormat = @"yyyyMMddHHmmsssss";
//设置保存到服务器中的图片名称
NSString * upFileName = [NSString stringWithFormat:@"%@_%@%d.%@",self.flowId,[dfm stringFromDate:[NSDate date]],i,@"jpeg"];
[dict setValue:upFileName forKey:@"upFileName"];
//设置类型
[dict setValue:[NSString stringWithFormat:@"image/jpeg"] forKey:@"upFileType"];
[self.photoFileArray addObject:dict];
}
//上传服务器
[self upLoadPhoto];
}
}
#iOS访问用户隐私时在info.plist
文件询问用户是否统一访问的常用key
NSAppleMusicUsageDescription
App需要您的同意,才能访问媒体资料库
NSBluetoothPeripheralUsageDescription
App需要您的同意,才能访问蓝牙
NSCalendarsUsageDescription
App需要您的同意,才能访问日历
NSCameraUsageDescription
App需要您的同意,才能访问相机
NSHealthShareUsageDescription
App需要您的同意,才能访问健康分享
NSHealthUpdateUsageDescription
App需要您的同意,才能访问健康更新
NSLocationAlwaysUsageDescription
App需要您的同意,才能始终访问位置
NSLocationUsageDescription
App需要您的同意,才能访问位置
NSLocationWhenInUseUsageDescription
App需要您的同意,才能在使用期间访问位置
NSMicrophoneUsageDescription
App需要您的同意,才能访问麦克风
NSMotionUsageDescription
App需要您的同意,才能访问运动与健身
NSPhotoLibraryUsageDescription
App需要您的同意,才能访问相册
NSRemindersUsageDescription
App需要您的同意,才能访问提醒事项
NSPhotoLibraryAddUsageDescription
允许保存图片到相册