一句话选择单个头像图片

新建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. CSS样式基础知识

    CSS样式基础知识 CSS样式概述 CSS是Cascading Style Sheet 的缩写.译作“层叠样式表单”.是用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言. 引用位 ...

  2. JS左侧菜单-03

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Chrome插件i18n多语言实现

    i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.Chrome插件框架中i18n的封装API: chrome.i18n.ge ...

  4. solrcloud集群部署

    Zookeeper安装 Zookeeper的安装和配置十分简单, 既可以配置成单机模式, 也可以配置成集群模式. 下面将分别进行介绍. 注意防火墙和selinux,关闭后进行如下配置,由于是Java写 ...

  5. [置顶] github 出现 Permission denied (publickey)的解决

    今天写了一篇博客,想push到github上的时候出现了以下错误 Permission denied (publickey). fatal: The remote end hung up unexpe ...

  6. 【2013Esri全球用户大会精彩看点】ArcGIS 10.2移动产品新特性

    Ø 全新的应用Explorer for ArcGIS 在2013年第四季度,Esri将发布全新的应用Explorer for ArcGIS,它将联合Collector和Operations Dashb ...

  7. c++课程设计之通讯录电话簿管理设计

    功能 本程序是利用c++实现一个简单的电话簿管理.我是在Linux下利用g++直接编译的,完全可以将文件在VC中编译执行.源程序如有需要自行下载,点此下载,下载程序编译执行 程序执行效果如下; 1.新 ...

  8. 应用Git Flow—Git团队协作最佳实践

    规范的Git使用 Git是一个很好的版本管理工具,不过相比于传统的版本管理工具,学习成本比较高. 实际开发中,如果团队成员比较多,开发迭代频繁,对Git的应用比较混乱,会产生很多不必要的冲突或者代码丢 ...

  9. 计算字符串中每种字符出现的次数[Dictionary<char,int>泛型集合用法]

    有一道经典的面试题: 统计 welcome to china中每个字符出现的次数,不考虑大小写.      第一个出现在脑海里的想法是: 1. 将字字符串转换成 char数组: 2. 用 for循环遍 ...

  10. C#简单验证并限制登录次数小示例

    描述:提示用户输入用户名,密码,与数据库中的数据匹配,如果正确则提示登陆成功,否则,提示登陆失败 错误次数超过三次,提示登陆次数过多,禁止登陆 数据表示例: //数据库中ErrorTimes的次数增加 ...