星空网 > 软件开发 > 操作系统

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

  首先,添加UINavigationControllerDelegate和UIImagePickerControllerDelegate两项protocol.
  使用UIImagePickerController,就必须实现UINavigationControllerDelegate这个protocol,因为调用过程中会出现NavigationBar,如果没实现,也不会说运行不了。只是Xcode会直接就给你一个warning.
Swift详解UIImagePickerController调用相册相机功能images/loading.gif' data-original="http://p.blog.csdn.net/images/p_blog_csdn_net/Ken_81515229/EntryImages/20091210/Picture%2013.png" />

  直接上自己用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.

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

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

希望对你有帮助!




原标题:Swift详解UIImagePickerController调用相册相机功能

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

8美金&20美金,东南亚、非洲的电商客单价为何差异巨大?:https://www.ikjzd.com/articles/9006
海关严查木质包装货物,无IPPC标识将无法出境!:https://www.ikjzd.com/articles/9007
亚马逊流量运营怎么玩才能爆单?以Anker为例:https://www.ikjzd.com/articles/9008
官宣!eBay海外仓2.0时代已开启!:https://www.ikjzd.com/articles/9009
八年经验跨境电商老运营教你如何做好一个新店铺:https://www.ikjzd.com/articles/9016
重要通知:Shopee开店无需任何费用:https://www.ikjzd.com/articles/9027
海陵岛马尾岛景点介绍 海陵马尾岛图片:https://www.vstour.cn/a/363177.html
无锡旅游景点竹海 - 无锡的竹海:https://www.vstour.cn/a/363178.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流