iOS获取相册/相机图片-------自定义获取图片小控件

一、功能简介

1、封装了一个按钮,点击按钮,会提示从何处获取图片:如果设备支持相机,可以从相机获取,同时还可以从手机相册获取图片。

2、选择图片后,有一个block回调,根据需求,将获得的图片拿来使用。

3、提供了初始化方法,可以灵活定义按钮,包括把返回的图片设置给按钮自己。

二、核心原理

1、UIAlertController 提示框

2、UIImagePickerController 图片拾取控制器

3、isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera 类方法,判断是否支持相机

4、遵守UIImagePickerControllerDelegate,UINavigationControllerDelegate

5、实现代理方法获得图片:- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

6、UIImageJPEGRepresentation 方法将图片压缩转换层NSData,然后写入沙盒

三、源码

1、.h文件

@interface ZQImageToolsButton : UIButton

/**
 *  可以获得储存图片信息的字典,里面包含了沙盒里的图片完整路径(程序每次运行沙盒的路径可能会不同,但是图片名不变)
 *
 *  @return
 */
-(NSDictionary * )getImageInfro;

/**
 *  初始化方法,点击按钮可以选择从相册或是相机(如果有相机)选择图片并返回图片
 *
 *  @param title      按钮的名字
 *  @param frame      按钮的frame
 *  @param controller 按钮所在的控制器,弹出对话框的控制器
 *  @param block      获得图片后的回调
 *  @param imageName  储存在沙盒里图片的名字
 *
 *  @return 返回一个按钮
 */
-(instancetype)initWithTitle:(NSString *)title frame:(CGRect)frame controller:(UIViewController *)controller imageBlock:(void(^)(UIImage *))block imageName :(NSString *)imageName;

@end

2、.m文件

@interface ZQImageToolsButton() <UIImagePickerControllerDelegate,UINavigationControllerDelegate>

@property(nonatomic,weak) UIViewController * controller;

@property(nonatomic,copy) void(^imageBlock)(UIImage *) ;

@property(nonatomic,strong) NSString * imageName;

@property(nonatomic,strong) NSDictionary * imageInfro;

@end

@implementation ZQImageToolsButton

-(NSDictionary * )getImageInfro
{
    return self.imageInfro;

}

-(instancetype)initWithTitle:(NSString *)title frame:(CGRect)frame controller:(UIViewController *)controller imageBlock:(void(^)(UIImage *))block imageName :(NSString *)imageName
{

    self = [[ZQImageToolsButton alloc]initWithFrame:frame];

    self.imageBlock = block;

    self.controller = controller;

    self.imageName = imageName;

    [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

    [self setTitle:title forState:UIControlStateNormal];

    [self addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];

    return self ;

}

- (void)btnClick:(UIButton *) btn
{

    // 创建图片管理器、 跳转到相机或相册页面
    UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

    imagePickerController.delegate = self;

    imagePickerController.allowsEditing = YES;

    //创建弹框

    UIAlertController * av = [UIAlertController alertControllerWithTitle:@"选择" message:@"从您的相册/相机选择" preferredStyle:UIAlertControllerStyleActionSheet];

    //设置image管理器的源类型

    __block NSInteger sourceType = 0;

    UIAlertAction * photo = [UIAlertAction actionWithTitle:@"我的相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

        //图片源为相册

        sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

        imagePickerController.sourceType = sourceType;

        [self.controller presentViewController:imagePickerController animated:YES completion:^{}];

    }];

    UIAlertAction * camera = [UIAlertAction actionWithTitle:@"我的相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

        //图片源为相机

        sourceType = UIImagePickerControllerSourceTypeCamera;

        imagePickerController.sourceType = sourceType;

        [self.controller presentViewController:imagePickerController animated:YES completion:^{}];

    }];

    UIAlertAction * cancle = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        //取消
    }];

    //判断是否支持相机

    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        [av addAction:photo];
        [av addAction:camera];
        [av addAction:cancle];

    }
    else
    {
        //如果不支持相机,就不用把相机按钮加入提示框了
        [av addAction:photo];
        [av addAction:cancle];
    }

    [self.controller presentViewController:av animated:YES completion:nil];

}

// 图片选择结束之后,走这个方法,字典存放所有图片信息
#pragma mark - image picker delegte 系统代理,返回从相册中选中的图片
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [picker dismissViewControllerAnimated:YES completion:^{

        NSLog(@"选好图片了");

    }];

    //获得选中的图片了!
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

    //block回调,获得图片后,交给控制器
    self.imageBlock(image);

    // 保存图片至本地,用传进来的名字重新拼接图片名字

    NSString * imgName = [NSString stringWithFormat:@"SavedImage-%@.png",self.imageName];

    //拼接保存至沙盒的路径
    NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:imgName];

    //记录一下图片的信息,存到字典中,需要的时候可以访问
    NSDictionary *dic = @{@"image":fullPath};
    self.imageInfro = dic;

    //保存到沙盒

    [self saveImage:image withName:imgName filePath:fullPath];

}

//保存至沙盒
- (void) saveImage:(UIImage *)currentImage withName:(NSString *)imageName filePath:(NSString *)filePath
{
    //压缩比例0.5
    NSData * imageData = UIImageJPEGRepresentation(currentImage, 0.5);

    // 将图片写入文件
    [imageData writeToFile:filePath atomically:NO];
}

@end

四、扩展

1、本例没有实现图片的多选

2、本例没有实现上传图片的业务逻辑

3、小东西,供娱乐交流使用

时间: 2024-11-09 07:33:13

iOS获取相册/相机图片-------自定义获取图片小控件的相关文章

自定义天气框小控件

一.封装了一个简便好用的天气框控件,有几个特点: 1.轻量级,使用百度天气接口,显示某个城市当前的天气,配有天气图标,日期. 2.使用封装的初始化方法,实例化控件,天气框的大小是固定的,字体颜色可以改变. 3.需要AFNetworking.SDWebImage框架(一般的项目中都会使用).使用了一个关于UIView的frame扩展(方便控件的布局,已在下文贴出源码). 4.点击天气框任意位置自动移除. 5.效果图示: 二.原代码: 1..h中的声明 @interface ZQWeatherVie

[iOS]技巧集锦:UITableView自定义Cell中的控件无法完全对齐Cell的左边界和右边界

这是个很诡异的问题,由于一些特殊需求,我的TableView的Cell的背景色是透明,其中的控件会有背景色,第一个控件和最后一个控件我都用IB自动设了约束,对齐Cell的左边界和右边界,但是自动约束很奇怪的是值都是-8(上下左右都是这个值).一开始并没在意因为显示出来是好的,但是不记得升级SDK到8.2还是8.3开始,左右就会多出空白来. 经过各种尝试,找到了解决方法.将左右的约束中item的related to margin(印象中是这么拼)取消勾选,值设为0就好了. 下班了等人,mac关了没

iOS选取相册中iCloud云上图片和视频的处理

关于iOS选取相册中iCloud云上图片和视频 推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因,需要处理接入一个视频模块,在视频选择的时候遇到了一个不太容易发现的bug,产生的原因是由于手机内存小,而用户又打开了相册同步iCloud, 加载中的图片 在这时,如果本地可用内存过小,会导致将本地相册中的图片或视频删除只留缩略图,如果App调用的时候想要选取这种图片就需要从iCloud云中进行下载,才

获取 AlertDialog自定义的布局 的控件

AlertDialog自定义的布局 效果图: 创建dialog方法的代码如下: 1 LayoutInflater inflater = getLayoutInflater(); 2 View layout = inflater.inflate(R.layout.dialog, 3 (ViewGroup) findViewById(R.id.dialog)); 4 new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout

【Android自定义ViewGroup】不一样的轮子,巧用类变量解决冲突,像IOS那样简单的使用侧滑删除,一个控件搞定Android item侧滑删除菜单。

================================================================================== [1 序言] 侧滑删除的轮子网上有很多,最初在github上看过一个,还是ListView时代,那是一个自定义ListView 实现侧滑删除的,当初就觉得这种做法不是最佳,万一我项目里又同时有自定义ListView的需求,会增加复杂度. 写这篇文章之前又通过毒度搜了一下,排名前几的CSDN文章,都是通过自定义ListVIew和Vie

[.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 &amp; 大型控件的ImageField)

[.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 & 大型控件的ImageField) http://www.dotblogs.com.tw/mis2000lab/archive/2014/05/19/ashx_beginner_05_db_picture_show_download.aspx 根据前面三篇文章的教学 完成后可以做出来  (请您务必依照顺序学习,不要只是找范例来Copy) [.ashx檔?泛型处理程序?]基础入门#1.

WPF 获取鼠标屏幕位置、窗口位置、控件位置

原文:WPF 获取鼠标屏幕位置.窗口位置.控件位置 public struct POINT { public int X; public int Y; public POINT(int x, int y) { this.X = x; this.Y = y; } } [DllImport("user32.dll")] public static extern bool GetCursorPos(out POINT lpPoint); //e.GetPosition(this); //(e

android - 自定义(组合)控件 + 自定义控件外观

转载:http://www.cnblogs.com/bill-joy/archive/2012/04/26/2471831.html android - 自定义(组合)控件 + 自定义控件外观 Android自定义View实现很简单 继承View,重写构造函数.onDraw,(onMeasure)等函数. 如果自定义的View需要有自定义的属性,需要在values下建立attrs.xml.在其中定义你的属性. 在使用到自定义View的xml布局文件中需要加入xmlns:前缀="http://sc

自定义下拉刷新控件

一.功能效果 1.在很多app中,在信息展示页面,当我们向下拖拽时,页面会加载最新的数据,并有一个短暂的提示控件出现,有些会有加载进度条,有些会记录加载日期.条目,有些还带有加载动画.其基本实现原理都相仿,本文中将探讨其实现原理,并封装出一个简单的下拉刷新控件 2.自定义刷新工具简单的示例 二.系统提供的下拉刷新工具 1.iOS6.0以后系统提供了自己的下拉刷新的控件:UIRefreshControl .例如,refreshControl,作为UITableViewController中的一个属

自定义快速查找字母控件

效果图如下: 首先看看布局文件,自定义的控件中包含一个 ListView,用于显示具体的数据内容: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     a