广

IOS开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    iOS App中调用相册中图片及获取最近的一张图片的方法

    2018-04-06 10:40:17 次阅读 稿源:互联网
    广告

    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)里面获取到。

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告