当前位置: > > > Swift - 使用UIImagePickerController从相册选择照片并展示

Swift - 使用UIImagePickerController从相册选择照片并展示

(本文代码已升级至Swift4)

1,UIImagePickerController介绍
(1)选择相册中的图片或者拍照,都是通过UIImagePickerController控制器实例化一个对象,然后通过self.present方法推送出界面显示。
(2)使用present的类需要实现UIImagePickerControllerDelegate,UINavigationControllerDelegate两个代理。
(3)UIImagePickerController可以通过isSourceTypeAvailable方法来判断设备是否支持照相机/图片库/相册功能。如果支持,可以通过sourceType属性来设置图片控制器的显示类型。

2,下面通过一个样例,演示如何使用UIImagePickerController
(1)点击“选择照片”,自动打开相册选择照片
(2)照片选中后,返回原界面并加载照片原图,同时控制台会打印照片的info信息
(3)如果选择照片前打开“编辑”开关,选中照片后会先进入照片编辑页面

3,效果图如下:
  
 

4,样例实现
(1)Info.plist配置
由于苹果安全策略更新,在使用Xcode8开发时,需要在Info.plist配置请求照片相的关描述字段(Privacy - Photo Library Usage Description)

(2)样例代码如下:
import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate,
UINavigationControllerDelegate {
    
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var editSwitch: UISwitch!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    //选取相册
    @IBAction func fromAlbum(_ sender: Any) {
        //判断设置是否支持图片库
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
            //初始化图片控制器
            let picker = UIImagePickerController()
            //设置代理
            picker.delegate = self
            //指定图片控制器类型
            picker.sourceType = UIImagePickerController.SourceType.photoLibrary
            //设置是否允许编辑
            picker.allowsEditing = editSwitch.isOn
            //弹出控制器,显示界面
            self.present(picker, animated: true, completion: {
                () -> Void in
            })
        }else{
            print("读取相册错误")
        }
        
    }
    
    //选择图片成功后代理
    func imagePickerController(_ picker: UIImagePickerController,
        didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        //查看info对象
        print(info)
        
        //显示的图片
        let image:UIImage!
        if editSwitch.isOn {
            //获取编辑后的图片
            image = info[.editedImage] as? UIImage
        }else{
            //获取选择的原图
            image = info[.originalImage] as? UIImage
        }
        
        imageView.image = image
        //图片控制器退出
        picker.dismiss(animated: true, completion: {
            () -> Void in
        })
    }
}

源码下载:hangge_769.zip
评论7
  • 7楼
    2017-11-15 20:32
    Skychf

    [discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}
    图片最后不显示.报上面的错误.

    站长回复

    我测试了下可以啊,你把我文章底部的工程下载下来,直接运行也不显示图片吗?

  • 6楼
    2017-08-16 11:57
    LB

    航哥,上传的图片只能显示一张啊?又没有多图预览的功能呢?就和微信发朋友圈那样的???

    站长回复

    多图选择可以参考我的另一篇文章:Swift - 相册图片多选功能的实现

  • 5楼
    2016-12-08 11:39
    小小白

    如何实现多张选取?

    站长回复

    UIImagePickerController没有多选功能。需要多选的话可以通过collectionView来实现。把照片缩略图加载显示在collectionView上,并给单元格添加相关的点击选择功能。

  • 4楼
    2016-08-16 10:59
    a_faint_hope

    文章写得太好了。请教一个问题,这个照片选择后,怎么进行裁切呢?

    站长回复

    文章代码有写啊,图片进入编辑状态后就可以进行裁减了。

  • 3楼
    2016-05-30 18:49
    小丑

    if self.imageView1.image == nil{
    self.imageView1.image = image
    }else{
    self.imageView2.image = image
    }用这个方法imageView1.image 就固定不变了,有什么方法可以改变 或者可以用多个按钮实现一对一选着图片

    站长回复

    那你就按钮使用不同的响应方法。比如点击按钮1执行方法1,方法1里面更新第1个imageView。点击按钮2执行方法2,方法2里面更新第2个imageView。

  • 2楼
    2016-04-08 17:00
    学习

    是同一个视图页面 有2个image 需要通过UIImagePickerController 来添加,如何实现。不是多张,谢谢站长

    站长回复

    那就每次判断下第1个imageView有没有添加图片,没有的话则给imageView1添加。imageView1已经有图片了话就给imageView2添加。
    if self.imageView1.image == nil{
       self.imageView1.image = image
    }else{
       self.imageView2.image = image
    }

  • 1楼
    2016-04-05 14:55
    学习

    2个 imageView.image如何处理呢

    站长回复

    你的意思是想能多选图片吗?UIImagePickerController一次只能选一张。想多选的话就要自己实现了。比如:通过ALAssetsLibrary去读取图片数据, 然后自己写一个table view 或collection view来实现多选打勾。