Swift详解UIImagePickerController调用相册相机功能

  首先,添加UINavigationControllerDelegate和UIImagePickerControllerDelegate两项protocol.
  使用UIImagePickerController,就必须实现UINavigationControllerDelegate这个protocol,因为调用过程中会出现NavigationBar,如果没实现,也不会说运行不了。只是Xcode会直接就给你一个warning.

  直接上自己用swift写的一个设置头像的小demo,可直接复制使用。注释清晰明了。

  

  1 //
  2 //  ViewController.swift
  3 //  ImageDemo
  4 //
  5 //  Created by fanviwa on 15/4/22.
  6 //  Copyright (c) 2015年 fanviwa. All rights reserved.
  7 //
  8
  9 import UIKit
 10
 11 class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
 12
 13     @IBOutlet weak var imageView: UIImageView!
 14      // 初始化图片选择控制器
 15     let imagePickerController: UIImagePickerController = UIImagePickerController()
 16     var isFullScreen: Bool = false
 17
 18     override func viewDidLoad() {
 19         super.viewDidLoad()
 20         // Do any additional setup after loading the view, typically from a nib.
 21         self.imageView.frame = CGRectMake(100, 100, 128, 128)
 22     }
 23
 24     override func didReceiveMemoryWarning() {
 25         super.didReceiveMemoryWarning()
 26         // Dispose of any resources that can be recreated.
 27     }
 28
 29     @IBAction func chooseImage(sender: UIButton) {
 30         // 设置代理
 31         self.imagePickerController.delegate = self
 32         // 设置是否可以管理已经存在的图片或者视频
 33         self.imagePickerController.allowsEditing = true
 34
 35         // 判断是否支持相机
 36         if(UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)){
 37             let alertController: UIAlertController = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
 38             //在iPad上使用表单(ActionSheet)需要设置描点(anchor point)
 39             var popover = alertController.popoverPresentationController
 40             if (popover != nil){
 41                 popover?.sourceView = sender
 42                 popover?.sourceRect = sender.bounds
 43                 popover?.permittedArrowDirections = UIPopoverArrowDirection.Any
 44             }
 45
 46             let cameraAction: UIAlertAction = UIAlertAction(title: "拍照换头像", style: .Default) { (action: UIAlertAction!) -> Void in
 47                 // 设置类型
 48                 self.imagePickerController.sourceType = UIImagePickerControllerSourceType.Camera
 49                 self.presentViewController(self.imagePickerController, animated: true, completion: nil)
 50             }
 51             alertController.addAction(cameraAction)
 52
 53             let photoLibraryAction: UIAlertAction = UIAlertAction(title: "从相册选择换头像", style: .Default) { (action: UIAlertAction!) -> Void in
 54                 // 设置类型
 55                 self.imagePickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
 56                 //改navigationBar背景色
 57                 self.imagePickerController.navigationBar.barTintColor = UIColor(red: 171/255, green: 202/255, blue: 41/255, alpha: 1.0)
 58                 //改navigationBar标题色
 59                 self.imagePickerController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
 60                 //改navigationBar的button字体色
 61                 self.imagePickerController.navigationBar.tintColor = UIColor.whiteColor()
 62                 self.presentViewController(self.imagePickerController, animated: true, completion: nil)
 63             }
 64             alertController.addAction(photoLibraryAction)
 65
 66             let cancelAction: UIAlertAction = UIAlertAction(title: "取消", style: .Cancel, handler: nil)
 67             alertController.addAction(cancelAction)
 68
 69             presentViewController(alertController, animated: true, completion: nil)
 70
 71         }else{
 72             let alertController: UIAlertController = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
 73             //设置描点(anchor point)
 74             var popover = alertController.popoverPresentationController
 75             if (popover != nil){
 76                 popover?.sourceView = sender
 77                 popover?.sourceRect = sender.bounds
 78                 popover?.permittedArrowDirections = UIPopoverArrowDirection.Any
 79             }
 80
 81             let photoLibraryAction: UIAlertAction = UIAlertAction(title: "从相册选择换头像", style: .Default) { (action: UIAlertAction!) -> Void in
 82                 // 设置类型
 83                 self.imagePickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
 84                 //改navigationBar背景色
 85                 self.imagePickerController.navigationBar.barTintColor = UIColor(red: 171/255, green: 202/255, blue: 41/255, alpha: 1.0)
 86                 //改navigationBar标题色
 87                 self.imagePickerController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
 88                 //改navigationBar的button字体色
 89                 self.imagePickerController.navigationBar.tintColor = UIColor.whiteColor()
 90                 self.presentViewController(self.imagePickerController, animated: true, completion: nil)
 91             }
 92             alertController.addAction(photoLibraryAction)
 93
 94             let cancelAction: UIAlertAction = UIAlertAction(title: "取消", style: .Cancel, handler: nil)
 95             alertController.addAction(cancelAction)
 96
 97             presentViewController(alertController, animated: true, completion: nil)
 98         }
 99     }
100
101     //实现ImagePicker delegate 事件
102     func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
103         picker.dismissViewControllerAnimated(true, completion: nil)
104         var image: UIImage!
105         // 判断,图片是否允许修改
106         if(picker.allowsEditing){
107             //裁剪后图片
108             image = info[UIImagePickerControllerEditedImage] as! UIImage
109         }else{
110             //原始图片
111             image = info[UIImagePickerControllerOriginalImage] as! UIImage
112         }
113         /* 此处info 有六个值
114         * UIImagePickerControllerMediaType; // an NSString UTTypeImage)
115         * UIImagePickerControllerOriginalImage;  // a UIImage 原始图片
116         * UIImagePickerControllerEditedImage;    // a UIImage 裁剪后图片
117         * UIImagePickerControllerCropRect;       // an NSValue (CGRect)
118         * UIImagePickerControllerMediaURL;       // an NSURL
119         * UIImagePickerControllerReferenceURL    // an NSURL that references an asset in the AssetsLibrary framework
120         * UIImagePickerControllerMediaMetadata    // an NSDictionary containing metadata from a captured photo
121         */
122         // 保存图片至本地,方法见下文
123         self.saveImage(image, newSize: CGSize(width: 256, height: 256), percent: 0.5, imageName: "currentImage.png")
124         let fullPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents").stringByAppendingPathComponent("currentImage.png")
125         println("fullPath=\(fullPath)")
126         let savedImage: UIImage = UIImage(contentsOfFile: fullPath)!
127         self.isFullScreen = false
128         self.imageView.image = savedImage
129         //在这里调用网络通讯方法,上传头像至服务器...
130     }
131     // 当用户取消时,调用该方法
132     func imagePickerControllerDidCancel(picker: UIImagePickerController) {
133         self.dismissViewControllerAnimated(true, completion: nil)
134     }
135
136     //保存图片至沙盒
137     func saveImage(currentImage: UIImage, newSize: CGSize, percent: CGFloat, imageName: String){
138         //压缩图片尺寸
139         UIGraphicsBeginImageContext(newSize)
140         currentImage.drawInRect(CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
141         let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
142         UIGraphicsEndImageContext()
143         //高保真压缩图片质量
144         //UIImageJPEGRepresentation此方法可将图片压缩,但是图片质量基本不变,第二个参数即图片质量参数。
145         let imageData: NSData = UIImageJPEGRepresentation(newImage, percent)
146         // 获取沙盒目录,这里将图片放在沙盒的documents文件夹中
147         let fullPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents").stringByAppendingPathComponent(imageName)
148         // 将图片写入文件
149         imageData.writeToFile(fullPath, atomically: false)
150     }
151
152     //实现点击图片预览功能,滑动放大缩小,带动画
153     override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
154         self.isFullScreen = !self.isFullScreen
155
156         let touch: UITouch = touches.first as! UITouch
157         let touchPoint: CGPoint  = touch.locationInView(self.view)
158         let imagePoint: CGPoint = self.imageView.frame.origin
159         //touchPoint.x ,touchPoint.y 就是触点的坐标
160         // 触点在imageView内,点击imageView时 放大,再次点击时缩小
161         if(imagePoint.x <= touchPoint.x && imagePoint.x + self.imageView.frame.size.width >= touchPoint.x && imagePoint.y <=  touchPoint.y && imagePoint.y+self.imageView.frame.size.height >= touchPoint.y){
162             // 设置图片放大动画
163             UIView.beginAnimations(nil, context: nil)
164             // 动画时间
165             UIView.setAnimationDuration(1)
166
167             if (isFullScreen) {
168                 // 放大尺寸
169                 self.imageView.frame = CGRectMake(0, 0, 480, 320)
170             }
171             else {
172                 // 缩小尺寸
173                 self.imageView.frame = CGRectMake(100, 100, 128, 128)
174             }
175             // commit动画
176             UIView.commitAnimations()
177         }
178     }
179 }

其次,还有一些检查是否有硬件的方法。

1 // 判断设备是否有摄像头
2     UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)
3     // 前面的摄像头是否可用
4     UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Front)
5     // 后面的摄像头是否可用
6     UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Rear)
7     // 相册是否可用
8     UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary)

当然,想要修改相册页面为中文还的在Info.plist配置文件中添加"Localized resources can be mixed"属性并设置为YES。

注意:iOS8.0后提示“

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

”是正常的,暂无解决办法。

希望对你有帮助!

时间: 2024-11-01 00:23:48

Swift详解UIImagePickerController调用相册相机功能的相关文章

Android学习Scroller(五)——详解Scroller调用过程以及View的重绘

MainActivity如下: package cc.ww; import android.os.Bundle; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.app.Activity;

详解MathType引用公式编号功能

在论文创作期间,如果需要在文本中删除大量的公式,手动编号删除的工作量是比较大的,使用MathType引用公式编号功能就可以节约大量的时间,提供很大的方便.本教程将详解MathType引用公式编号功能. MathType提供四种类型的公式输入:inline.display style.left numbered display style.right numbered display style,分别是文本中的公式.没有编号的单行公式.编号在左边.编号在右边.这些功能都已经在安装MathType后

Android调用系统相机功能

在常规应用开发过程中,我们经常会使用到手机的相机功能,通过调用系统相机方便快捷的帮助我们实现拍照功能,本篇我将带领大家实现一下,如何通过调用系统相机实现拍照. 第一种:调用系统相机拍照,通过返回的照片缩略图展示我们的拍照图片 打开系统相机: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, TAKE_PICTURE);// 如果用Activity.RESULT_O

详解JavaScript调用栈、尾递归和手动优化

调用栈(Call Stack) 调用栈(Call Stack)是一个基本的计算机概念,这里引入一个概念:栈帧. 栈帧是指为一个函数调用单独分配的那部分栈空间. 当运行的程序从当前函数调用另外一个函数时,就会为下一个函数建立一个新的栈帧,并且进入这个栈帧,这个栈帧称为当前帧.而原来的函数也有一个对应的栈帧,被称为调用帧.每一个栈帧里面都会存入当前函数的局部变量. 当函数被调用时,就会被加入到调用栈顶部,执行结束之后,就会从调用栈顶部移除该函数.并将程序运行权利(帧指针)交给此时栈顶的栈帧.这种后进

swift详解之十-------------异常处理、类型转换 ( Any and AnyObject )

异常处理.类型转换 ( Any and AnyObject ) 1.错误处理 (异常处理) swift 提供第一类错误支持 ,包括在运行时抛出 ,捕获 , 传送和控制可回收错误.在swift中 ,错误用复合 ErrorType 协议的值表示 . Swift枚举把一系列相关的错误组合在一起.同时可以把一些相关的值和错误关联在一起 . 因此 编译器会为实现ErrorType协议的Swift枚举类型自动实现相应的合成 这里看个很简单的小例子. enum WrongName:ErrorType{ cas

Swift详解之四-------妈妈再也不用担心我的闭包了

妈妈再也不用担心我的闭包了 注:本文为作者自己总结,过于基础的就不再赘述 ,都是亲自测试的结果.如有错误或者遗漏的地方,欢迎指正,一起学习. swift中闭包是一个很强大的东西,闭包是自包含的函数代码块,可以在代码中被传递和使用.跟C 和 Objective-C 中的代码块(blocks)很相似 .这个大家必须掌握!必须掌握!必须掌握!重要的事情要说三遍 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.下面我们就来攻克它! 1.闭包函数

IOS SDK详解之拍照/相册(默认+自定义拍照界面)

原创blog,转载请注明出处 blog.csdn.net/hello_hwc 前言: 本来要更新NSURLSession的UploadTask的,结果写那个Demo的时候想要写成拍照上传,然后就想到先写一个关于拍照的Demo吧.本文会先介绍下如何使用系统提供的界面拍照和选择相册,然后自定义拍照界面.注意,本文使用的是UIImagePickerController,所以不能完全的自定义,如果想要彻底的自定义拍照,建议选择AV Foundation这个框架来做 Demo效果 进入系统的拍照界面 进入

swift详解之十一------------协议、委托(代理)模式

协议.委托(代理)模式 注:本小节总结协议以及依靠协议实现委托,这将在以后经常被使用.是一个非常重要的模块 看下官方的定义:协议定义了一个蓝图 , 规定了用来实现某一特定工作或者功能所必须的方法和属性,类.结构体.或者枚举类型都可以遵循协议, 并提供具体实现来完成协议定义的方法和功能 . 任意能够满足协议要求的类型都被成为遵循了这个协议 1.协议的语法 协议的关键字:protocol 协议的语法: protocol Pro1{ //这里定义属性或者方法 } 要使一个类或者结构体遵循某个协议 ,

swift详解之九---------------自动引用计数、循环引用

自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 为了确保在