• 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!

  • 相关阅读:
    Asp.NetCore3.1 WebApi 获取配置json文件中的数据
    Dapper同时操作任意多张表的实现
    将视图批量新增到PowerDesigner中并以model图表的形式展示
    .NetCore3.1获取文件并重新命名以及大批量更新及写入数据
    .NetCore 简单的使用中间件
    比较复杂的SQL转Linq
    Asp.NetCore3.1版本的CodeFirst与经典的三层架构与AutoFac批量注入
    Git与GitLab的分支合并等简单的测试操作
    Winform的控件以及DataGridView的一般使用
    在Linux系统中运行并简单的测试RabbitMq容器
  • 原文地址:https://www.cnblogs.com/zzzPark/p/6655005.html
Copyright © 2020-2023  润新知