iOS App中调用相册中图片及获取最近的一张图片的方法
UIImagePickerController从拍照、图库、相册获取图片
iOS获取图片有三种方法:
1.直接调用摄像头拍照
2.从相册中选择
3.从图库中选择
UIImagePickerController是系统提供的用来获取图片和视频的接口;
用UIImagePickerController类来获取图片视频,大体分为以下几个步骤:
1.初始化UIImagePickerController类;
2.设置UIImagePickerController实例的数据来源类型(下面解释);
3.设置设置代理;
4.如果需要做图片修改的话设置allowsEditing=yes。
数据来源类型一共有三种:
enum{ UIImagePickerControllerSourceTypePhotoLibrary,//来自图库 UIImagePickerControllerSourceTypeCamera,//来自相机 UIImagePickerControllerSourceTypeSavedPhotosAlbum//来自相册 };
在用这些来源的时候最好检测以下设备是否支持;
if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { NSLog(@"支持相机"); } if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { NSLog(@"支持图库"); } if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) { NSLog(@"支持相片库"); }
调用摄像头来获取资源
-(void)viewDidLoad{ [superviewDidLoad]; picker=[[UIImagePickerControlleralloc]init]; picker.view.backgroundColor=[UIColororangeColor]; UIImagePickerControllerSourceTypesourcheType=UIImagePickerControllerSourceTypeCamera; picker.sourceType=sourcheType; picker.delegate=self; picker.allowsEditing=YES; }
上面只是实例了UIImagePickerController及其属性在需要获取图片的时候需要弹出窗口调用
[selfpresentViewController:pickeranimated:YEScompletion:nil];
我们还需要代理来获取我们选中的图片
UIImagePickerControllerDelegate
代理中一共三个方法其中一个3.0已经废弃了,只剩下两个我们需要用的
-(void)imagePickerController:(UIImagePickerController*)pickerdidFinishPickingMediaWithInfo:(NSDictionary *)info;
当用户选取完成后调用;
-(void)imagePickerControllerDidCancel:(UIImagePickerController*)picker;
当用户取消选取时调用;
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info;
选取的信息都在info中,info是一个字典。
字典中的键:
- NSString*const UIImagePickerControllerMediaType;指定用户选择的媒体类型(文章最后进行扩展)
- NSString*const UIImagePickerControllerOriginalImage;原始图片
- NSString*const UIImagePickerControllerEditedImage;修改后的图片
- NSString*const UIImagePickerControllerCropRect;裁剪尺寸
- NSString*const UIImagePickerControllerMediaURL;媒体的URL
- NSString*const UIImagePickerControllerReferenceURL;原件的URL
- NSString*const UIImagePickerControllerMediaMetadata;当来数据来源是照相机的时候这个值才有效
获取最近的一张图片
最近的需求需要我模仿微信聊天提示最新的一张图片这个功能。
先讲讲思路。
思路很简单,点击“+”号的时候获取相册列表,获取最新保存的一张图片。根据图片保存时间,与当前时间戳进行计算,获得间隔时间。从而判断是否是需求的时间间隔。(时间间隔自定义)
计算公式:当前时间-图片保存时间<=时间间隔
那么根据这个思路就开始写一个分类。
它是关于ALAssetsLibrary的获取功能,那么就根据他写一个分类。
但是在iOS9后这个库过时了,不过还是将他封装一份,到时候新建一个工具类进行适配就行了。
//ALAssetsLibrary+WJ.h #import<AssetsLibrary/AssetsLibrary.h> @interfaceALAssetsLibrary(WJ) /** * 获取最新一张图片 * * @paramblock回调 */ -(void)latestAsset:(void(^_Nullable)(ALAsset*_Nullableasset,NSError*_Nullableerror))block; @end //ALAssetsLibrary+WJ.m #import"ALAssetsLibrary+WJ.h" @implementationALAssetsLibrary(WJ) -(void)latestAsset:(void(^)(ALAsset*_Nullable,NSError*_Nullable))block{ [selfenumerateGroupsWithTypes:ALAssetsGroupSavedPhotosusingBlock:^(ALAssetsGroup*group,BOOL*stop){ if(group){ [groupsetAssetsFilter:[ALAssetsFilterallPhotos]]; [groupenumerateAssetsWithOptions:NSEnumerationReverse/*遍历方式*/usingBlock:^(ALAsset*result,NSUIntegerindex,BOOL*stop){ if(result){ if(block){ block(result,nil); } *stop=YES; } }]; *stop=YES; } }failureBlock:^(NSError*error){ if(error){ if(block){ block(nil,error); } } }]; } @end
在iOS8PhotoKit已经存在了。所以以后写iOS8以上的应用可以直接使用。
PhotoKit简单实用封装。具体详细性能请看参考提供的链接。
//PHAsset+WJ.h #import<Photos/Photos.h> @interfacePHAsset(WJ) /** * 获取最新一张图片 */ +(PHAsset*)latestAsset; @end //PHAsset+WJ.m #import"PHAsset+WJ.h" @implementationPHAsset(WJ) +(PHAsset*)latestAsset{ //获取所有资源的集合,并按资源的创建时间排序 PHFetchOptions*options=[[PHFetchOptionsalloc]init]; options.sortDescriptors=@[[NSSortDescriptorsortDescriptorWithKey:@"creationDate"ascending:NO]]; PHFetchResult*assetsFetchResults=[PHAssetfetchAssetsWithOptions:options]; return[assetsFetchResultsfirstObject]; } @end
根据需求本文章不提供其他功能写法(ps:最主要本人也才刚使用>.<)。
图片保存时间都可以在对应的asset(PHAsset,AlAsset)里面获取到。