基于Swift的iOS应用程序开发:使用UIImagePickerController从相册选择图片

一、设置系统权限

这一点非常重要,找到工程内的info.plist文件,在其中添加以下项:
Privacy - Photo Library Usage Description
为你添加的项设置Type为String,然后在Value一列中输入一句话,可以任意输入,这句话旨在提醒用户我们需要获得使用摄像头的权限:

二、实现/继承代理

调取系统相册需要用到以下两个系统代理:
UIImagePickerControllerDelegate
UINavigationControllerDelegate
所以我们的ViewController需要实现这两个代理:
import UIKit

class DemoTakePhotoViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
//...
}

三、编写方法,调取系统相册

调取摄像头其实就是呼出一个系统已定义的ViewController:
UIImagePickerController
具体使用该ViewController的方式如下:
let photoPickerViewController:UIImagePickerController = UIImagePickerController()
photoPickerViewController.sourceType = UIImagePickerControllerSourceType.photoLibrary
photoPickerViewController.delegate = self
self.present(photoPickerViewController, animated: true, completion: nil)

注意上面代码中,在第二行等号的右边所出现的以下代码:
UIImagePickerControllerSourceType.photoLibrary
就是这句代码,指定了UIImagePickerController要打开的是系统相册,我们可以查看一下UIImagePickerControllerSourceType类的源代码,发现它本身是一个枚举:
public enum UIImagePickerControllerSourceType : Int {
 
    case photoLibrary

    case camera

    case savedPhotosAlbum
}
这个枚举非常简单易懂:
photoLibrary:系统图库
camera:系统摄像头
savedPhotosAlbum:相册
也就是说我们可以通过设置photoPickerViewController的sourceType为上述三项中的一项,来决定调用哪个系统功能

稍微进一步查看一下源代码,我们发现还有其它非常多的枚举量:
public enum UIImagePickerControllerSourceType : Int {

    
    case photoLibrary

    case camera

    case savedPhotosAlbum
}

public enum UIImagePickerControllerQualityType : Int {

    
    case typeHigh // highest quality

    case typeMedium // medium quality, suitable for transmission via Wi-Fi 

    case typeLow // lowest quality, suitable for tranmission via cellular network

    @available(iOS 4.0, *)
    case type640x480 // VGA quality

    @available(iOS 5.0, *)
    case typeIFrame1280x720

    @available(iOS 5.0, *)
    case typeIFrame960x540
}

public enum UIImagePickerControllerCameraCaptureMode : Int {

    
    case photo

    case video
}

public enum UIImagePickerControllerCameraDevice : Int {

    
    case rear

    case front
}

public enum UIImagePickerControllerCameraFlashMode : Int {

    
    case off

    case auto

    case on
}
看懂这些枚举量的用途不需要太好的英文水平,除了在本例中用到的UIImagePickerControllerSourceType外,我在这里将其它枚举量简单做个说明:

UIImagePickerControllerQualityType:成像质量

UIImagePickerControllerCameraCaptureMode:拍照或者录像

UIImagePickerControllerCameraDevice:选择前置摄像头或是后置摄像头

UIImagePickerControllerCameraFlashMode:闪光灯模式


不再展开了,继续回来。我将调用摄像头拍照的代码封装成了一个方法,便于绑定到触发事件上:
/**
 *  当用户点击界面上的相册按钮时,会打开系统相册,从而让用户选择照片
 */
@IBAction func pickPhotoFromAlbum(_ sender: Any) {
    /*
     *  用来打开系统相册的view controller
     */
    let photoPickerViewController:UIImagePickerController = UIImagePickerController()
    photoPickerViewController.sourceType = UIImagePickerControllerSourceType.photoLibrary
    photoPickerViewController.delegate = self
    self.present(photoPickerViewController, animated: true, completion: nil)

}

四、编写方法,获取从相册选择的图片

要获取从相册所拍选择的图片,我们主要需要重载以下方法:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
//...
}
注意这个方法入参列表中的第二个参数“didFinishPickingMediaWithInfo info:[String : Any]”,选择的结果就会被保存在这个参数里面,我们可以通过以下方法来获取:
guard var selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage else {
    fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
}
这样一来,从相册选择的照片就成为了一个UIImage对象。
下面贴出完整的方法:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    guard var selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage else {
        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
    }

    picker.dismiss(animated: true, completion: nil)
}
拿到了UIImage对象后,我们就可以做自己需要的操作了,比如将图片显示在界面上,或是上传到服务器

五、编写方法,取消选择

以下方法为我们提供了退出相册的途径:
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated: true, completion: nil)
}

小结

调取相册的各项功能都用到了Swift提供的代理(delegate)机制,它的最大的好处在于,在上述各步骤中,我们只有在调取相册的时候需要手动触发,其它方法全部都由代理自动调用,我们只要实现这些方法就可以了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值