
·您现在的位置: 江北区云翼计算机软件开发服务部 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> ☻相机相册
首先,添加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.
”是正常的,暂无解决办法。

希望对你有帮助!