iOS App中调用相册中图片及获取最近的一张图片的方法
uiimagepickercontroller从拍照、图库、相册获取图片
ios 获取图片有三种方法:
1. 直接调用摄像头拍照
2. 从相册中选择
3. 从图库中选择
uiimagepickercontroller 是系统提供的用来获取图片和视频的接口;
用uiimagepickercontroller 类来获取图片视频,大体分为以下几个步骤:
1. 初始化uiimagepickercontroller 类;
2. 设置uiimagepickercontroller 实例的数据来源类型(下面解释);
3. 设置设置代理;
4. 如果需要做图片修改的话设置allowsediting =yes。
数据来源类型一共有三种:
enum {
uiimagepickercontrollersourcetypephotolibrary ,//来自图库
uiimagepickercontrollersourcetypecamera ,//来自相机
uiimagepickercontrollersourcetypesavedphotosalbum //来自相册
};
在用这些来源的时候最好检测以下设备是否支持;
if([uiimagepickercontroller issourcetypeavailable:uiimagepickercontrollersourcetypecamera])
{
nslog(@"支持相机");
}
if([uiimagepickercontroller issourcetypeavailable:uiimagepickercontrollersourcetypephotolibrary])
{
nslog(@"支持图库");
}
if ([uiimagepickercontroller issourcetypeavailable:uiimagepickercontrollersourcetypesavedphotosalbum])
{
nslog(@"支持相片库");
}
调用摄像头来获取资源
- (void)viewdidload {
[super viewdidload];
picker = [[uiimagepickercontroller alloc]init];
picker.view.backgroundcolor = [uicolor orangecolor];
uiimagepickercontrollersourcetype sourchetype = uiimagepickercontrollersourcetypecamera;
picker.sourcetype = sourchetype;
picker.delegate = self;
picker.allowsediting = yes;
}
上面只是实例了uiimagepickercontroller及其属性 在需要获取图片的时候需要弹出窗口调用
[self presentviewcontroller:picker animated:yes completion:nil];
我们还需要代理来获取我们选中的图片
uiimagepickercontrollerdelegate
代理中一共三个方法 其中一个3.0 已经废弃了,只剩下两个我们需要用的
- (void)imagepickercontroller:(uiimagepickercontroller *)picker didfinishpickingmediawithinfo:(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>
@interface alassetslibrary (wj)
/**
* 获取最新一张图片
*
* @param block 回调
*/
- (void)latestasset:(void(^_nullable)(alasset * _nullable asset,nserror *_nullable error)) block;
@end
//alassetslibrary+wj.m
#import "alassetslibrary+wj.h"
@implementation alassetslibrary (wj)
- (void)latestasset:(void (^)(alasset * _nullable, nserror *_nullable))block {
[self enumerategroupswithtypes:alassetsgroupsavedphotos usingblock:^(alassetsgroup *group, bool *stop) {
if (group) {
[group setassetsfilter:[alassetsfilter allphotos]];
[group enumerateassetswithoptions:nsenumerationreverse/*遍历方式*/ usingblock:^(alasset *result, nsuinteger index, bool *stop) {
if (result) {
if (block) {
block(result,nil);
}
*stop = yes;
}
}];
*stop = yes;
}
} failureblock:^(nserror *error) {
if (error) {
if (block) {
block(nil,error);
}
}
}];
}
@end
在ios8 photokit已经存在了。所以以后写ios8以上的应用可以直接使用。
photokit简单实用封装。具体详细性能请看参考提供的链接。
//phasset+wj.h
#import <photos/photos.h>
@interface phasset (wj)
/**
* 获取最新一张图片
*/
+ (phasset *)latestasset;
@end
//phasset+wj.m
#import "phasset+wj.h"
@implementation phasset (wj)
+ (phasset *)latestasset {
// 获取所有资源的集合,并按资源的创建时间排序
phfetchoptions *options = [[phfetchoptions alloc] init];
options.sortdescriptors = @[[nssortdescriptor sortdescriptorwithkey:@"creationdate" ascending:no]];
phfetchresult *assetsfetchresults = [phasset fetchassetswithoptions:options];
return [assetsfetchresults firstobject];
}
@end
根据需求本文章不提供其他功能写法(ps:最主要本人也才刚使用>.<)。
图片保存时间 都可以在对应的asset(phasset,alasset)里面获取到。
上一篇: 正睿暑期培训day4考试
下一篇: 饸饹面的做法具体步骤是什么呢