你的位置:首页 > 操作系统

[操作系统]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! UIImage109     }else{110       //原始图片111       image = info[UIImagePickerControllerOriginalImage] as! UIImage112     }113     /* 此处info 有六个值114     * UIImagePickerControllerMediaType; // an NSString UTTypeImage)115     * UIImagePickerControllerOriginalImage; // a UIImage 原始图片116     * UIImagePickerControllerEditedImage;  // a UIImage 裁剪后图片117     * UIImagePickerControllerCropRect;    // an NSValue (CGRect)118     * UIImagePickerControllerMediaURL;    // an NSURL119     * UIImagePickerControllerReferenceURL  // an NSURL that references an asset in the AssetsLibrary framework120     * UIImagePickerControllerMediaMetadata  // an NSDictionary containing metadata from a captured photo121     */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 = false128     self.imageView.image = savedImage129     //在这里调用网络通讯方法,上传头像至服务器...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.isFullScreen155     156     let touch: UITouch = touches.first as! UITouch157     let touchPoint: CGPoint = touch.locationInView(self.view)158     let imagePoint: CGPoint = self.imageView.frame.origin159     //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.

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

希望对你有帮助!