一句话选择单个头像图片

新建ImagePickerViewController类:

/* let imagePicker = ImagePickerViewController()

imagePicker.delegate = self

self.presentViewController(imagePicker, animated: false, completion: nil)

*/

实现类代理方法

//MARK: -ImagePickerViewDelegate

extension FourViewController:ImagePickerViewDelegate{

func getImage(image: UIImage) {

headView?.headImage?.image = image

}

}

ImagePickerViewController类中实现代码

import UIKit

import AVFoundation

import MobileCoreServices

protocol ImagePickerViewDelegate {

func getImage(image:UIImage)

}

class ImagePickerViewController: UIViewController,UIActionSheetDelegate {

var delegate:ImagePickerViewDelegate?

var alertController:UIAlertController?

var pickCtr:UIImagePickerController?

init(){

super.init(nibName: nil, bundle: nil)

self.modalPresentationStyle = .OverFullScreen

self.view.backgroundColor = UIColor.clearColor()

pickCtr = UIImagePickerController()

pickCtr!.delegate = self;

pickCtr!.allowsEditing = true;

}

required init?(coder aDecoder: NSCoder) {

fatalError("init(coder:) has not been implemented")

}

override func viewDidAppear(animated: Bool) {

super.viewDidAppear(animated)

if (alertController == nil) {

alertController = UIAlertController(title: "选择文件源", message: nil, preferredStyle: .ActionSheet)

alertController?.addAction(UIAlertAction(title: "打开相机", style: .Default, handler: { (action) in

self.takePhoto()

}))

alertController?.addAction(UIAlertAction(title: "打开相册", style: .Default, handler: { (action) in

self.localPhoto()

}))

alertController?.addAction(UIAlertAction(title: "取消", style: .Default, handler: { (action) in

self.dismissViewControllerAnimated(false, completion: nil)

}))

self.presentViewController(alertController!, animated: true, completion: nil)

}

}

/// 打开相册

func localPhoto(){

if (self.isPhotoLibraryAvailable()){

pickCtr?.sourceType = UIImagePickerControllerSourceType.PhotoLibrary

self.presentViewController(pickCtr!, animated: true, completion: nil)

}else{

let alert = UIAlertController(title: nil, message: "相册不可用", preferredStyle: UIAlertControllerStyle.Alert)

alert.addAction(UIAlertAction(title: "确定", style: UIAlertActionStyle.Default, handler: { (action) in

self.dismissViewControllerAnimated(false, completion: nil)

}))

self.presentViewController(alert, animated: true, completion: nil)

}

}

/// 打开相机takePhoto

func takePhoto(){

let mediaType = AVMediaTypeVideo

let authStatus = AVCaptureDevice.authorizationStatusForMediaType(mediaType)

let you = self.isCameraAvailable()==true

let my = self.doesCameraSupportTakingPhotos()==true

pprintLog("you:\(you)")

pprintLog("my:\(my)")

pprintLog("myandyou:\(my&&you)")

if(authStatus == AVAuthorizationStatus.Restricted || authStatus == AVAuthorizationStatus.Denied){

let alert = UIAlertController(title: nil, message: "相机不可用,请到系统设置里更改", preferredStyle: UIAlertControllerStyle.Alert)

alert.addAction(UIAlertAction(title: "确定", style: UIAlertActionStyle.Default, handler: { (action) in

self.dismissViewControllerAnimated(false, completion: nil)

}))

self.presentViewController(alert, animated: true, completion: nil)

}else if(self.isCameraAvailable()==true && self.doesCameraSupportTakingPhotos()==true){

pickCtr!.sourceType = UIImagePickerControllerSourceType.Camera

self.presentViewController(pickCtr!, animated: true, completion: nil)

}else{

let alert = UIAlertController(title: nil, message: "相机不可用", preferredStyle: UIAlertControllerStyle.Alert)

alert.addAction(UIAlertAction(title: "确定", style: UIAlertActionStyle.Default, handler: { (action) in

self.dismissViewControllerAnimated(false, completion: nil)

}))

self.presentViewController(alert, animated: true, completion: nil)

}

}

override func viewDidLoad() {

super.viewDidLoad()

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

}

//MARK: - UIImagePickerControllerDelegate

extension ImagePickerViewController:UIImagePickerControllerDelegate,UINavigationControllerDelegate{

//取消

func imagePickerControllerDidCancel(picker: UIImagePickerController) {

pickCtr?.dismissViewControllerAnimated(true, completion: {

self.dismissViewControllerAnimated(false, completion: nil)

})

}

// 得到图片

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

let type:String = info[UIImagePickerControllerMediaType] as! String

if (type == kUTTypeImage as String){

let img:UIImage = info[UIImagePickerControllerEditedImage] as! UIImage

//对拍照后的照片进行处理

let image1 = self.fixOrientationIm(img)

//防止图片翻滚

let image2 = self.fixOrientationIm(image1)

//改变图片的size

let image3 = self.image(image2, targetSize: CGSizeMake(110, 80))

pickCtr?.dismissViewControllerAnimated(true, completion: {

self.dismissViewControllerAnimated(false, completion: {

self.delegate?.getImage(image3)

})

})

}

}

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

}

}

/// 判断手机是否支持。。相机....

extension ImagePickerViewController{

/// 判断设备是否有摄像头

func isCameraAvailable()->Bool{

return UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)

}

/// 后面的摄像头是否可用

func isRearCameraAvailable()->Bool{

return UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Rear)

}

/// 前面的摄像头是否可用

func isFrontCameraAvailable()->Bool{

return UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Front)

}

/// 相册是否可用

func isPhotoLibraryAvailable()->Bool{

return UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary)

}

/// 相机是否可以取到图片

func doesCameraSupportTakingPhotos()->Bool{

return self.cameraSupportsMedia( kUTTypeImage as String, paramSourceType: UIImagePickerControllerSourceType.Camera)

}

/// 相机是否可以取到视频

func doesCameraSupportTakingVideos()->Bool{

return self.cameraSupportsMedia( kUTTypeMovie as String, paramSourceType: UIImagePickerControllerSourceType.Camera)

}

/// 相册是否可以取到视频

func canUserPickVideosFromPhotoLibrary()->Bool{

return self.cameraSupportsMedia(kUTTypeMovie as String, paramSourceType: UIImagePickerControllerSourceType.PhotoLibrary)

}

/// 相册是否可以取到图片

func canUserPickPhotosFromPhotoLibrary()->Bool{

return self.cameraSupportsMedia(kUTTypeImage as String, paramSourceType: UIImagePickerControllerSourceType.PhotoLibrary)

}

func cameraSupportsMedia(paramMediaType:String,paramSourceType:UIImagePickerControllerSourceType)->Bool{

var result = false

if paramMediaType.characters.count==0{

return false

}

let availableMediaTypes:NSArray? = UIImagePickerController.availableMediaTypesForSourceType(paramSourceType)

if availableMediaTypes != nil{

availableMediaTypes!.enumerateObjectsUsingBlock { (obj, idx,stop) in

let mediaType:String = obj as! String

if mediaType == paramMediaType{

result = true

//        stop = true;

}

}

}

return result;

}

}

//MARK: - 图片方法

extension ImagePickerViewController{

//MARK:- 相机照片处理

func fixOrientationIm(aImage:UIImage) -> UIImage{

// No-op if the orientation is already correct

if (aImage.imageOrientation == UIImageOrientation.Up){

return aImage

}

// We need to calculate the proper transformation to make the image upright.

// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.

var transform  = CGAffineTransformIdentity

switch (aImage.imageOrientation) {

case UIImageOrientation.Down:

break

case UIImageOrientation.DownMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);

transform = CGAffineTransformRotate(transform, CGFloat(M_PI));

break

case UIImageOrientation.Left:

break

case UIImageOrientation.LeftMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);

transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2));

break

case UIImageOrientation.Right:

break

case UIImageOrientation.RightMirrored:

transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);

transform = CGAffineTransformRotate(transform, -CGFloat(M_PI_2));

break

default:

break

}

switch (aImage.imageOrientation) {

case UIImageOrientation.UpMirrored:

break

case UIImageOrientation.DownMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);

transform = CGAffineTransformScale(transform, -1, 1);

break

case UIImageOrientation.LeftMirrored:

break

case UIImageOrientation.RightMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);

transform = CGAffineTransformScale(transform, -1, 1);

break

default:

break

}

// Now we draw the underlying CGImage into a new context, applying the transform

// calculated above.

let ctx:CGContextRef = CGBitmapContextCreate(nil, Int(aImage.size.width), Int(aImage.size.height), CGImageGetBitsPerComponent(aImage.CGImage!), 0, CGImageGetColorSpace(aImage.CGImage!)!, CGImageGetBitmapInfo(aImage.CGImage!).rawValue)!

CGContextConcatCTM(ctx, transform);

switch (aImage.imageOrientation) {

case UIImageOrientation.Left:

break

case UIImageOrientation.LeftMirrored:

break

case UIImageOrientation.Right:

break

case UIImageOrientation.RightMirrored:

// Grr...

CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage!);

break

default:

CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage!);

break

}

// And now we just create a new UIImage from the drawing context

let cgimg = CGBitmapContextCreateImage(ctx)

let img = UIImage(CGImage: cgimg!)

//        CGContextRelease(ctx)

//        CGImageRelease(cgimg)

return img;

}

/// 裁剪图片

func image(image:UIImage,targetSize:CGSize)-> UIImage{

UIGraphicsBeginImageContext(targetSize)

image.drawInRect(CGRectMake(0, 0, targetSize.width, targetSize.height))

let newImage = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()

return newImage!

}

///得到图片

func getImageWithName(iName:String)->UIImage{

let cloudIcon = UIImage(contentsOfFile: self.cachedPicPath(iName))

return cloudIcon!

}

/// 存储图片

func saveImage(image:UIImage,name:String){

UIImagePNGRepresentation(image)?.writeToFile(name, atomically: true)

}

/// 获取图片路径

func cachedPicPath(imageN:String)->String{

let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentationDirectory, NSSearchPathDomainMask.UserDomainMask, true)

let documentsPath:NSString = paths.first! as NSString

let imageName = imageN+".png"

let path = documentsPath.stringByAppendingPathComponent(imageName)

return path

}

}

swift 2 选择头像图片的更多相关文章

  1. 相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传

    一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) ...

  2. swift上传头像

    很久没有写博客了,今天特地写了这个,也是一边仿照别人写的demo,注释部分都是需要的.需要的同学可以参考一下. @IBAction func headImageBtnPage(){  //上传头像 / ...

  3. Android中调用另一个Activity并返回结果-以模拟选择头像功能为例

    场景 Android中点击按钮启动另一个Activity以及Activity之间传值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  4. ajax实现注册并选择头像后上传

    在初次接触ajax后,我们做了一个crm训练的项目,大多数小组都有注册用户这一项,但是都忽略掉了一个功能,那就是,很多网站的注册是可以上传头像的,在这里我做了一个在已有的头像数组里选择图片上传作头像的 ...

  5. php使用post动态选择头像和js事件动态改变头像

    <html> <head> <meta http-equit="Content-type" content="text/html" ...

  6. jQuery滑过头像图片展示个人信息效果

    这是一款经典的jQuery图片插件,同时,也可以是一款jQuery提示框插件.这款jQuery插件的功能是当你把鼠标滑过头像图片缩略图时,即可弹出头像对应用户的详细个人信息,弹出的标签虽然不大,但是还 ...

  7. Android选择头像

    http://www.jianshu.com/p/8b3e78046c1c 注意:在Android6.0之后,使用相机拍照需要权限 在选择头像使用相机拍摄时添加以下代码即可. Acp.getInsta ...

  8. Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)

    上一篇我们介绍了怎样由uri转换成String ,本文就用到了上篇文章的方法.以下我们介绍一下怎样设置头像后将头像图片上传到云端的方法,本文基于Bmob提供的服务. 看一下代码:(布局文件和前两篇文章 ...

  9. 「小程序JAVA实战」小程序头像图片上传(下)(45)

    转自:https://idig8.com/2018/09/09/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan44/ 接下来,我们应 ...

随机推荐

  1. SharePoint Access Service-PowerShell

    1. 配置应用程序Log文件大小 Set-SPAccessServiceApplication –Identity "Access Services" –ApplicationLo ...

  2. VS2010 boost 使用问题一例

    最近有一个VS2010的工程用到了boost库,编译的时候报下面的错误: >LINK : fatal error LNK1104: cannot open file 'libboost_thre ...

  3. ok6410 u-boot-2012.04.01移植五支持DM9000

    继ok6410 u-boot-2012.04.01移植四后,开发板基本已支持MLC NAND,但还有一些细节地方修改,这节增加DM9000支持,通过网卡tftp程序到内存,接着通过NAND命令写到NA ...

  4. Epicor系统二次开发

    Epicor系统二次开发 一.获取或修改界面EpiDataView的字段数据(Get EpiDataView data) C# EpiDataView edv = (EpiDataView)oTran ...

  5. apns关于APP数字角标的理解

    前两天群里有兄弟在吐槽,做远程推送的时候:老板要求APP桌面图标的右上角显示红色未读数字(数字角标)要精准,有多少未读通知就显示数字几:但是后台的弟兄在发送推送通知的时候,每次的角标是1,然后要移动端 ...

  6. Swift3集成极光推送

      现在很多程序都开始使用Swift开发了,但是第三方库大多数都是用OC写的,所以我们要使用Swift和OC混编.今天的内容主要讲Swift3.0集成极光推送. 1.准备工作   集成指南,极光上说的 ...

  7. SQL Server 2016 的「動態資料遮罩 (Dynamic Data Masking)」

    一些特別注重資訊安全.個人資料的公司或產業 (如: 金融.保險業),通常「測試用資料庫」的資料,會加上「遮蔽:去識別化」的功能,避免個資外洩.以往必須自己撰寫 SQL 語句或 Stored Proce ...

  8. Head First设计模式——策略设计模式

    策略设计模式 说在前面的话 入软件一年啦,平心而论,总算不限于只会钻研些基础的语言语法了,数据结构和算法也恶补的差不多了.所以~趁着现在一边实习一边啃<Head First设计模式>的功夫 ...

  9. 认识div在排版中的作用

    在网页制作过程过中,可以把一些独立的逻辑部分划分出来,放在一个<div>标签中,这个<div>标签的作用就相当于一个容器. 语法: <div>-</div&g ...

  10. Appium同时运行多个设备

    为了提高测试效率,测试需要同时在多个android设备上运行,就需要启动多个appium. 启动appium时,为每个设备设置不同的端口号,并为driver设置该设备的udid.见如下实例,关键是红色 ...