当前位置: 首页 > news >正文

iOS小技巧之UIImagePickerController实现头像选择

介绍

编辑用户头像是帐号编辑功能的必备功能之一,现在Swift实现的头像选择还不多,这里给大家简单介绍一下
图片描述

实现

viewDidLoad中为头像添加点击手势响应

UIImageView默认不支持交互,我们先要允许它交互,需要为它添加一个TapGestureRecognizer

    override func viewDidLoad() {
        super.viewDidLoad()
        //设置头像圆角
        icon.layer.cornerRadius = icon.frame.width/2
        //设置遮盖额外部分,下面两句的意义及实现是相同的
         //icon.clipsToBounds = true
        icon.layer.masksToBounds = true
        
        //为头像添加点击事件
        icon.userInteractionEnabled=true
        let userIconActionGR = UITapGestureRecognizer()
        userIconActionGR.addTarget(self, action: Selector("selectIcon"))
        icon.addGestureRecognizer(userIconActionGR)
        
        //从文件读取用户头像
        let fullPath = ((NSHomeDirectory() as NSString) .stringByAppendingPathComponent("Documents") as NSString).stringByAppendingPathComponent(iconImageFileName)
        //可选绑定,若保存过用户头像则显示之
        if let savedImage = UIImage(contentsOfFile: fullPath){
            self.icon.image = savedImage
        }
        
    }

弹出一个AlertController让用户选择

//选择头像的函数
    func selectIcon(){
        let userIconAlert = UIAlertController(title: "请选择操作", message: "", preferredStyle: UIAlertControllerStyle.ActionSheet)
        
        let chooseFromPhotoAlbum = UIAlertAction(title: "从相册选择", style: UIAlertActionStyle.Default, handler: funcChooseFromPhotoAlbum)
        userIconAlert.addAction(chooseFromPhotoAlbum)
        
        let chooseFromCamera = UIAlertAction(title: "拍照", style: UIAlertActionStyle.Default,handler:funcChooseFromCamera)
        userIconAlert.addAction(chooseFromCamera)
        
        let canelAction = UIAlertAction(title: "取消", style: UIAlertActionStyle.Cancel,handler: nil)
        userIconAlert.addAction(canelAction)
        
        self.presentViewController(userIconAlert, animated: true, completion: nil)
    }

根据不同的选择弹出UIImagePickerController

要使用UIImagePickerController,首先要继承UIImagePickerControllerDelegate, UINavigationControllerDelegate

    //从相册选择照片
    func funcChooseFromPhotoAlbum(avc:UIAlertAction) -> Void{
        let imagePicker = UIImagePickerController()
        //设置代理
        imagePicker.delegate = self
        //允许编辑
        imagePicker.allowsEditing = true
        //设置图片源
        imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        //模态弹出IamgePickerView
        self.presentViewController(imagePicker, animated: true, completion: nil)
    }
//拍摄照片
func funcChooseFromCamera(avc:UIAlertAction) -> Void{
    let imagePicker = UIImagePickerController()
    //设置代理
    imagePicker.delegate = self
    //允许编辑
    imagePicker.allowsEditing=true
    //设置图片源
    imagePicker.sourceType = UIImagePickerControllerSourceType.Camera
    //模态弹出IamgePickerView
    self.presentViewController(imagePicker, animated: true, completion: nil)
}
    func imagePickerControllerDidCancel(picker: UIImagePickerController){
    picker.dismissViewControllerAnimated(true, completion: nil)
}

实现UIImagePickerDelegate方法

    //UIImagePicker回调方法
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        //获取照片的原图
        //let image = (info as NSDictionary).objectForKey(UIImagePickerControllerOriginalImage)
        //获得编辑后的图片
        let image = (info as NSDictionary).objectForKey(UIImagePickerControllerEditedImage)
        //保存图片至沙盒
        self.saveImage(image as! UIImage, imageName: iconImageFileName)
        let fullPath = ((NSHomeDirectory() as NSString).stringByAppendingPathComponent("Documents") as NSString).stringByAppendingPathComponent(iconImageFileName)
        //存储后拿出更新头像
        let savedImage = UIImage(contentsOfFile: fullPath)
        self.icon.image=savedImage
        picker.dismissViewControllerAnimated(true, completion: nil)
    }

保存图片到沙盒

    //MARK: - 保存图片至沙盒
    func saveImage(currentImage:UIImage,imageName:String){
        var imageData = NSData()
        imageData = UIImageJPEGRepresentation(currentImage, 0.5)!
        // 获取沙盒目录
        let fullPath = ((NSHomeDirectory() as NSString).stringByAppendingPathComponent("Documents") as NSString).stringByAppendingPathComponent(imageName)
        // 将图片写入文件
        imageData.writeToFile(fullPath, atomically: false)
    }

更换效果

图片描述

相关文章:

  • 批量添加tiptop账号(批量添加Linux账号)
  • layer官方演示与讲解(jQuery弹出层插件)
  • 2015年10月26日作业
  • Python windows serial
  • ubuntu 系统网络突然网络已禁用
  • Golang的安装
  • 2015年9大优秀项目管理工具集锦
  • Linux 脚本 sh 和 ./ 的区别
  • 如何签名apk,并让baidu地图正常显示
  • hadoop中namespace id怎么修改
  • 输出九九乘法口诀表
  • CSS/LESS tips and snippets
  • 关于Normalize.css
  • VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
  • 适合办公室里做的拉腿运动
  • HomeBrew常规使用教程
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JS专题之继承
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • MobX
  • QQ浏览器x5内核的兼容性问题
  • React Transition Group -- Transition 组件
  • webpack+react项目初体验——记录我的webpack环境配置
  • 闭包,sync使用细节
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 面试遇到的一些题
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 项目管理碎碎念系列之一:干系人管理
  • 用Visual Studio开发以太坊智能合约
  • #define 用法
  • #QT项目实战(天气预报)
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (175)FPGA门控时钟技术
  • (2015)JS ES6 必知的十个 特性
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (8)STL算法之替换
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (九十四)函数和二维数组
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)SpringBoot3---尚硅谷总结
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .bat文件调用java类的main方法
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net 流——流的类型体系简单介绍
  • @31省区市高考时间表来了,祝考试成功
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略