Ios开发相册和相机的使用—UIImagePickerController

在开发中,有时候需要获取用户的相册或者调用相机采集图片,比如APP的头像,此时可以使用UIImagePickerController.

提醒一点。UIImagePickerController继承于UINavigationController所以在调用代理方法时,应同时遵循两个代理协议。另外,它还可以用于拍摄视频。

官网文档:UIImagePickerController Class Reference   UIImagePickerControllerDelegate

一. UIIMagePickerController的简单使用步骤

1、 初始化UIImagePickerController类
2、 设置其实例的数据源
3、 设置其实例的代理方法(使用的文件应遵守两个代理协议)
4、 设置图片是否可被编辑 .allowsEditing = false/true 默认false
5、 设置其他属性,(跳转到相册或者相机选择图片)

6、 完成图选择后回掉代理方法【重点】这样才可以回去到图片数据

三种数据来源:

UIImagePickerControllerSourceTypePhotoLibrary, // 来自图库
UIImagePickerControllerSourceTypeCamera, // 来自相机

UIImagePickerControllerSourceTypeSavedPhotosAlbum // 来自相册

注意:开发的时候需要在info中添加相册访问权:Privacy - Photo Library Usage Description

和相机访问权:Privacy - Camera Usage Description

否则无法使用

二. 使用UIImagePickerController创建一个照片选择器

import UIKitprotocol PhotoPickerViewControllerDelegate {func getImageFromPicker(image:UIImage)//传回照片
}class PhotoPickerViewController: UIViewController ,UIImagePickerControllerDelegate,UINavigationControllerDelegate{var alert:UIAlertController?  //一个弹出提示框var picker:UIImagePickerController? //放照片的选择器var delegate:PhotoPickerViewControllerDelegate!init(){super.init(nibName: nil, bundle: nil)self.modalPresentationStyle = .OverFullScreen //[learn]这样可以设置它的透明,看到上一个视图self.view.backgroundColor = UIColor.clearColor()self.picker = UIImagePickerController()self.picker?.allowsEditing = false //设置照片不可编辑self.picker?.delegate = self //注意选择器的代理遵守两个}/**调用视图出现后,要显示的哪个对话框(注意对话框一般是放在某个动作发生后)*/override func viewDidAppear(animated: Bool) { //对话框的设置if alert == nil {alert = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)self.alert?.addAction(UIAlertAction(title: "从相册选择", style: UIAlertActionStyle.Default, handler: { (action) in self.loadPhoto()}))self.alert?.addAction(UIAlertAction(title: "打开相机", style: UIAlertActionStyle.Default, handler: { (action) in self.takePhoto()}))self.alert?.addAction(UIAlertAction(title: "取消", style: .Cancel, handler: { (action) inself.dismissViewControllerAnimated(true, completion: nil)//注意这句非常重要,否则无法与上一个界面交互}))self.presentViewController(self.alert!, animated: true, completion: nil) //注意相似的东西有好多个了,注意使用的是函数}}/**从相册选择*/func loadPhoto(){self.picker?.sourceType = .PhotoLibrary //将选择器设置为相册self.presentViewController(self.picker!, animated: true) { }}/**打开相机调用相机,首先许哟判断相机存在否*/func takePhoto(){if UIImagePickerController.isSourceTypeAvailable(.Camera){//[learn] 判断相机是否存在self.picker?.sourceType = .Camera  //将选择器的资源类型设置为相机self.presentViewController(self.picker!, animated: true, completion: {  //将当前的控制器转向相机})}else{let alertView = UIAlertController(title: "该机型无相机", message: nil, preferredStyle: .Alert)//这个ios9.0已经弃用了,要求识用那个UIalertControlleralertView.addAction(UIAlertAction(title: "取消", style:.Cancel, handler: { (action) inself.dismissViewControllerAnimated(true, completion: nil)}))self.presentViewController(alertView, animated: true, completion: { })//显示对提示框}}//取消选择照片后的回掉//取消照片选择器选择(返回上一个控制器)func imagePickerControllerDidCancel(picker: UIImagePickerController) {self.picker?.dismissViewControllerAnimated(true, completion: { //去掉照片相册控制器self.dismissViewControllerAnimated(true, completion: { //去本选择器控制器,回到哪个调用的哪个控制器})})}//选择照片回掉func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {let image = info[UIImagePickerControllerOriginalImage] as! UIImage //获取到选择器的原始图片self.picker?.dismissViewControllerAnimated(true, completion: { self.dismissViewControllerAnimated(true) {self.delegate.getImageFromPicker(image) //调用代用将图片传回}})}override func viewDidLoad() {super.viewDidLoad()}required init?(coder aDecoder: NSCoder) {fatalError("初始化构造器没有实例")}override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()}}

三、其他的特别需求设置

1.调用前摄像头(默认调用后摄像头)

//如果有前置摄像头则调用前置摄像头
if UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Front){
    picker.cameraDevice = UIImagePickerControllerCameraDevice.Front
}

2、设置闪光灯

//开启闪光灯
picker.cameraFlashMode = UIImagePickerControllerCameraFlashMode.On

3.选择回掉中info参数解释

此处参数 info 是一个字典,下面是字典中的键值 (从相机获取的图片和相册获取的图片时,两者的info值不尽相同)

UIImagePickerControllerMediaType; // 媒体类型

UIImagePickerControllerOriginalImage;  // 原始图片

UIImagePickerControllerEditedImage;    // 裁剪后图片

UIImagePickerControllerCropRect;       // 图片裁剪区域(CGRect)

UIImagePickerControllerMediaURL;       // 媒体的URL

UIImagePickerControllerReferenceURL    // 原件的URL

UIImagePickerControllerMediaMetadata    // 当数据来源是相机时,此值才有效

4.将拍照后的照片放在相册中

UIImageWriteToSavedPhotosAlbum   ()

四、使用VPImageCropperViewController剪切图片

在github上下载VPImageCropperVieController,将.h和.m添加到桥接文件即可使用

使用时候记得实现代理方法回掉(截取和取消)

不过我用的时候会发生图片与屏幕不贴合????带解决

//获取图片func getImageFromPicker(image: UIImage) {var rect = CGRect(x: 0, y: 100, width: SCREEN_WINDTH, height: SCREEN_HEIGHT*1.2)var vpc = VPImageCropperViewController(image: image, cropFrame: rect, limitScaleRatio: 2)vpc.delegate = selfself.presentViewController(vpc, animated: true) {}}
/**实现代理方法VPImageCropperDelegate*/func imageCropper(cropperViewController: VPImageCropperViewController!, didFinished editedImage: UIImage!) {cropperViewController.dismissViewControllerAnimated(true) {self.bookTitle?.faceButton?.setImage(editedImage, forState: .Normal)}}func imageCropperDidCancel(cropperViewController: VPImageCropperViewController!) {cropperViewController.dismissViewControllerAnimated(true) {}}

ios开发学习笔记--调用相册或相机(UIImagePickerController)相关推荐

  1. IOS开发学习笔记(一)

    概述: iOS是苹果开发的手持设备操作系统(iPhone,iPad,iPod touch,iPad mini). 基于UNIX,层次架构:核心操作系统层(Core OS)-> 核心服务层(Cor ...

  2. ios开发学习笔记--Core Motion

    iOS开发学习笔记之CoreMotion-运动传感器 官网文档:CoreMotion Framework Reference 一.     简介 现在的苹果手机都基本有运动传感器,能够过获取到设备的加 ...

  3. IOS开发学习笔记-----UILabel 详解

    IOS开发学习笔记-----UILabel 详解 01 //创建uilabel 02 UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMa ...

  4. iOS开发学习笔记-C语言学习(一)

    1.什么是iOS? 提问:买来一台新电脑后,应该先干什么? iOS就是搭载在iPhone .iPad.iPod.Apple TV上的操作系统. 苹果系统 那么,操作系统是什么呢? 操作系统简单来说就是 ...

  5. IOS开发学习笔记(1)

    最近参与到IOS项目的开发中,原来只接触过一点手机开发,但是对IOS开发是毫无经验.原来一直很排斥Objective-C,排斥的原因主要有这么几点.首先Objective-C是C的扩展,我对C就不是很 ...

  6. ios开发学习笔记(这里一定有你想要的东西,全部免费)

    参考:http://blog.csdn.net/mad1989/article/details/7972612 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置backgr ...

  7. ios开发学习笔记(这里一定有你想要的东西,全部免费

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用) 其实在代码里还是可以设置的,那就是删除背景view [[ ...

  8. IOS开发学习笔记018- 一般控件的使用

    1.移动 2.动画 3.缩放 3.旋转 4.简化代码 5.总结 UIButton 的两种状态 normal highlighted  1.移动 OC语法规定:不允许直接修改某个对象中结构体属性的成员. ...

  9. IOS开发学习笔记011-xcode使用技巧

    xcode使用技巧 1.自动生成类 2.断点调试 3.代码段保存 4.注释标记 1.新建类,自动生成两个文件和基本结构 第一步  第二步,选择新建一个类,而不是一个源文件  第三步,书写类名一级自己要 ...

最新文章

  1. 转;说说AngularJS中的$parse和$eval
  2. 讲php fpm的书,细说PHP-fpm
  3. nginx忽略文件名大小写
  4. HG20615法兰数据注意事项
  5. gRPC基础--Protobuf编码格式详解
  6. 设计模式三(工厂方法模式)学习笔记
  7. c++内存优化:二级间接索引模式内存池
  8. ppp协议 服务器,PPP上的认证协议
  9. fatal error: opencv2/opencv.hpp: 没有那个文件或目录
  10. 媒体查询加上rem实现页面字体大小自适应
  11. 湖南工大计算机学院大一分班,大一新生入学计算机分级教学考试会影响分班吗?...
  12. 个人网站如何申请支付接口?(教程)
  13. 昆明理工大学计算机考研资料汇总
  14. 转载:全志问题解决方法
  15. 计算机技术在排水领域的应用,计算机软件在排水工程设计上的应用解析
  16. 什么是 AI(人工智能(Artificial Intelligence)
  17. @OneToMany---ManyToOne
  18. 计算机科学研究算法的局限性,YOCSEF 论坛 | CNCC2018 — 研究经典计算机算法已经过时了吗?...
  19. 【机器学习】舍友居然偷偷在看这篇文章·入门机器学习
  20. Not live in vain——Leo关于生与死的感悟

热门文章

  1. 第4章javascript变量、作用域和内存回收
  2. 手摸手,带你用 vue 动画实现原生 app 切换效果,丝滑般的体验
  3. 自动化运维之CentOS7下PXE+Kickstart+DHCP+TFTP+HTTP无人值守安装系统
  4. 大数据处理时用到maven的repository
  5. 企业运维之域控篇(十)--SERVER 2003 迁移到 SERVER 2008 (异机)
  6. 比较难理解的知识汇集
  7. python爬虫---从零开始(一)初识爬虫
  8. 常见的浏览器兼容性问题与解决方案——CSS篇
  9. c# 调用SQL Server存储过程返回值(转)
  10. Android:控件WebView显示网页