IOS 相册图片调取

今天面试的时候有个人问我 如何从相册或者拍照那调取一张图片。

嗯我就来说说吧!

先通过阅读几个相关demo源码来解释说明:

 文件viewcontroller.h

#import "ViewController.h"

#import "SZImageView.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

 - (void)viewDidLoad {

    [super viewDidLoad];

   

   [SZImageView shareImageView].imageBlock  = ^(UIImage *image){

    self.imageView.image = image;

    }; //szimageview shareimageview是封装好的一个类对象

       //imageblock是它的一个属性 

}

- (IBAction)photoAlbum:(UIButton *)sender {

     [[SZImageView shareImageView]getFrame:CGSizeMake(300, 300) viewController:self];

}   //这两个是storyboard绑定按钮函数 是显示出一个画面让你选择拍照还是录像   

- (IBAction)cameraClick:(UIButton *)sender {

    [[SZImageView shareImageView]getFrame:CGSizeMake(300, 300) viewController:self];

}  //这个也一样!

接下来就是仔细剖析 szimageview 类 

这是 szimageview.h文件

#import <UIKit/UIKit.h>

typedef  void(^ImageBlock)(UIImage *image);

@interface SZImageView : UIView

@property(nonatomic,copy)ImageBlock imageBlock;

+(SZImageView *)shareImageView;

-(void)getFrame:(CGSize)size viewController:(id)viewController;

@end

uikit 框架下的 szimageview 是uiview的派生类.

它有一个imageblock 函数指针属性,一个 初始化函数shareimageview 一个getframe函数。

接下来才是重要的代码。

先介绍一下mobilecoreservices

MobileCoreServices

Use uniform type identifier (UTI) information to create and manipulate data that can be exchanged between your app and other apps and services.

简单的讲没有它就没有办法获取相册。

szimageview.m文件

#define Widthscale(scale) ((([UIScreen mainScreen].bounds.size.width) * scale) / (375))

#define Heightscale(scale) ((([UIScreen mainScreen].bounds.size.height) * scale) / (667)) //这是一个定义屏幕宽度高度的东西

#import "SZImageView.h"

#import <MobileCoreServices/MobileCoreServices.h>//这个是导入一个框架 

@interface SZImageView()<UINavigationControllerDelegate,UIImagePickerControllerDelegate>

//说明了szimageview 实现uiimagepickercontroller 和navigationcontroller 的协议

@property(nonatomic,strong)UINavigationController *navigation;

@property(nonatomic,strong) UIView *viewbg;

@property(nonatomic,strong)UIViewController *viewImageController;

@end

@implementation SZImageView

+(SZImageView *)shareImageView{

    static SZImageView *imageview = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        imageview = [[[NSBundle mainBundle]loadNibNamed:@"SZImageView" owner:nil options:nil]lastObject];

    });

    return imageview;

}//这是个初始化函数 返回szimageview 本身的一个类对象 

-(void )getFrame:(CGSize)size viewController:(id)viewController{

    self.viewImageController = viewController;

    UIWindow *window = [UIApplication sharedApplication].keyWindow; //获取window

    window.frame = [UIScreen mainScreen].bounds; //把屏幕大小赋值给window.frame

    _viewbg = [[UIView alloc]initWithFrame:window.frame]; //用window.frame 初始化暗屏

    _viewbg.backgroundColor = [[UIColor blackColor]colorWithAlphaComponent:0.7];//设置暗屏的黑暗程度

    [window addSubview:_viewbg];//将暗屏加到window上

     [_viewbg addSubview:self];//暗屏把szimageview加在它自己身上

     self.frame = CGRectMake(0, 0,Widthscale(size.width), Heightscale(size.height));//给szimageview大小,位置赋值

    self.center = window.center;

}

- (IBAction)openCamera:(UIButton*)sender { //打开相机按钮函数

    [self configImagePickerController:1];

}

 - (IBAction)openPhoto:(UIButton*)sender { //打开相册按钮函数

    

     [self configImagePickerController:0];

}

- (IBAction)delect:(UIButton *)sender { //取消按钮函数

    [self delectAllView];

}

-(void)delectAllView{

        [self removeFromSuperview]; //将自己从暗屏取下

        [self.viewbg removeFromSuperview];//将暗屏从windows取下

}

-(void)configImagePickerController:(NSInteger)number{

    UIImagePickerController *picker = [[UIImagePickerController alloc] init];

    picker.delegate = self;//初始化一个imagepicker controller。把其代理设置给self

    picker.allowsEditing = YES; //可编辑

    

    switch (number) {

        case 0:

            //判断是否可以打开相册

            if ([self isPhotoLibrary]) {

                picker.sourceType =UIImagePickerControllerSourceTypePhotoLibrary;

            }else{ //将picker 类型设置成相册

                NSLog(@"无法打开相册");

                return;

            }

            break;

        case 1:

            if ([self isCameravail]){

                //摄像头

                picker.sourceType = UIImagePickerControllerSourceTypeCamera;

            }else{

                NSLog(@"没有摄像头");

                return;

            }

            break;

        default:

            break;

    }

    

    

    [self delectAllView]; //将uiviewcontroller上的view都删掉 

    [self.viewImageController  presentViewController:picker animated:YES completion:nil];

   //换成picker    

}

 //

//判断相机是否可用

-(BOOL)isCameravail{

    return   [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];

}

-(BOOL)isPhotoLibrary{

    return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];

}

//uiimageviewcontroller 协议内容 先不予讨论先 

这里有说明http://www.cnblogs.com/BeyondAverage0908/p/4673473.html

 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{

    

    NSString *mdeiaType = [info objectForKey:UIImagePickerControllerMediaType];

    if ([mdeiaType isEqualToString:(__bridge NSString*)kUTTypeImage]) {

        UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

        if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

            SEL saveImage = @selector(ImageWasSaveSuccessfully:didFinishSavingWithError:contextInfo:);

            UIImageWriteToSavedPhotosAlbum(image, self, saveImage, nil);

        }

            self.imageBlock(image);

    }else{

    }

    [picker dismissViewControllerAnimated:YES completion:nil];

}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{

    [picker dismissViewControllerAnimated:YES completion:nil];

}

-(void)ImageWasSaveSuccessfully:(UIImage *)paraImage didFinishSavingWithError:(NSError *)error contextInfo:(NSDictionary<NSString *,id> *)paraInfo{

    if (error == nil) {

        NSLog(@"保存成功");

    }else{

        NSLog(@"%@",error);

    }

}

简单的说想获取ios 相册里的图片一般做法就是导入 mobilecoreservices头文件 

并且让controller  遵守两个协议一个是uiiamgepickerdelegate 一个是 uinavigationcontrollerdelegate 但其实navigationdelegate这个协议我并没有看到起了什么作用我注释了它但仍然可以打开相册。所以我不知道大家为什么要写uinavigationcontrolerdelegate.

再者,如果是不是一个普通的相册,是有点想faceapp 这样的相册展示。那就很有困难了!

我猜那种是重写了uiimagepickerview!

原文地址:https://www.cnblogs.com/zzzPark/p/6655005.html