类
1.1UIImagePickerController
UIImagePickerController类可以实现系统相册选取,以及拍照功能。
ps:模拟器不能拍照,要测试拍照功能,要用真机进行测试(ipad或iphone)
1.1.1添加点击检测
当点击添加照片控件时完成检测,这里以tableView中点击行响应事件为例子:
//点击行时发生 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //当点击第一行时 if indexPath.row == 0{ //建立底部弹出框 let 拍照源 = UIAlertController(title: "choice your photo source", message: "照片来源", preferredStyle: .ActionSheet) //建立弹出框事件 let 相册 = UIAlertAction(title: "从手机相册选择", style: .Default, handler: {aciton in //检测是否获取权限(相册),如果有即调回相关函数 if UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary){ let imagePicker = UIImagePickerController() //不要忘记在相册选择视图初始化后,将代理设为当前视图控制器 imagePicker.delegate = self imagePicker.allowsEditing = true imagePicker.sourceType = .PhotoLibrary //present;出现,提出 self.present(imagePicker, animated: true, completion: nil) } }) //建立弹出框事件 let 即拍 = UIAlertAction(title: "拍照?", style: .Default, handler: { ation in //检测是否获取权限(相机),如果有即调回相关函数 if UIImagePickerController.isSourceTypeAvailable(.Camera){ let imagePicker1 = UIImagePickerController() //不要忘记在拍照选择视图初始化后,将代理设为当前视图控制器 imagePicker1.delegate = self imagePicker1.allowsEditing = true imagePicker1.sourceType = .Camera self.present(imagePicker1, animated: true, completion: nil) } }) //建立弹出框事件 let 返回 = UIAlertAction(title: "取消", style: .Cancel, handler: nil) //添加弹出框事件 拍照源.addAction(相册) 拍照源.addAction(即拍) 拍照源.addAction(返回) self.present(拍照源, animated: true, completion: nil) } //点击已点选项框取消已点击状态 tableView.deselectRowAtIndexPath(indexPath, animated: true) }
1.1.2获取相册中的图片
step1:
与相册互动,需要遵从UIImagePickerControllerDelegate,UINavigationControllerDelegate
即在所在控制器中添加UIImagePickerControllerDelegate,UINavigationControllerDelegate
step2:
当用户从相册中选择了一张图片,以下方法被触发:
func imagePickerController(picker:UIImagePickerController,didFinishPickingMediaWithInfo info:[String:AnyObject]){}
实现这个方法,可以从方法的参数中取回图片。
实现选择了照片的代理方法
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { //从媒体信息这个字典数据中查询“原始图像”字典 相片.image = info[UIImagePickerControllerOriginalImage]as? UIImage //图片填充模式:平铺 相片.contentMode = .ScaleAspectFill //超出部分裁边 相片.clipsToBounds = true //让相册选择视图退场 self.dismiss(animated: true, completion: nil) }
如果用户在照片获取器中单击取消按钮,那么就关闭它。因为照片或去获取器默认时会占据整个屏幕,在单击取消按钮以后我们需要销毁它并返回之前调用它的控制器中。
//用户取消获取器操作时调用的方法 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { self.dismiss(animated: true, completion: nil ) }
Ps:
不要忘记在相册选择视图初始化后,将代理设为当前视图控制器
override func tableView(tableView:UITableView,didSelectRowAtIndexPath indexPath:NSIndexPath){
if UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary){
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
}
Swift3.0更新
访问照片库的前期准备
要想成功访问照片库,在Xcode8中我们还需要在info.plist文件中添加两条配置信息,这样才可以防止调出照片获取器时候应用程序崩溃退出。
step1:
在项目导航栏中打开info.plist文件,在编译区域中选择最下面一行的配置信息,如图:
step2:
确保最后一行的配置信息为收缩状态(头部的灰色三角指向自己),单击配置信息右侧的圆圈灰色加号,此时会添加一行新的配置信息。
step3:
在添加的配置信息行中,设置Key为Privary - Media Library Usage Description,Type 为String,Value 为你的描述(Test需要使用该设备的媒体库)。同上,再添加一个配置信息,设置Key 为Privary - Photo Library Usage Description,Type 为String,Value 为你的描述 (Test需要使用该设备的照片库)
添加单击手势识别
Image View控件在默认情况下时不具备交互功能的,这与控制器视图相同,但我们同样可以将它的交互功能开通。
Step1: 打开Image View所在VC文件,在viewDidLoad()方法底部添加下面的代码:
let imgTap = UITapGestureRecognizer(target:self,action:#selector(loadImg)) imgTap.numberofTapsRequired = 1 avaImg.isUserInteractionEnabled = true avaImg.addGestureRecognizer(imgTap)
扩展:系统预定义的手势识别类型
单击(任意单击次数) —— UITapGestureRecognizer
捏合(用于放大或缩小视图)—— UIPinchGestureRecognizer
平移或拖曳 —— UIPanGestureRecognizer
划动(任意方向) —— UISwipeGestureRecognizer
旋转 —— UIRotationGestureRecognizer
长按(也可以理解为按住) —— UILongPressGestureRecognizer
Step2: 创建照片获取器
func loadImg(recognizer:UITapGestureRecognizer) { let picker = UIImagePickerController() picker.delegate = self picker.sourceType = .photoLibrary picker.allowsEditing = true present(picker, animated:true,completion:nil) }
Ps:
首先将self(当前的VC类对的对象,也就是当前的视图控制器对象)赋值给照片获取器delegate属性,这需要当前VC类必须符合UIImagePickerControllerDelegate协议,另外还要让当前VC类符合UINavigationControllerDelegate协议,这个协议是必须的,因为前面的协议用到了后面的协议。不添加后者,Xcode会报错!
UIImagePickerControllerDelegate协议的用处在于,可以说明用户是否选择了一张照片或者是否取消了选择。而第二个UINavigationControllerDelegate在这里并没有什么实际意义,仅仅用它来确保Xcode不报错,其更深层的意义我们就不再细究了。
其次,我们设置了获取器的sourceType为.photoLibrary,也就是告诉获取器从照片库中获取照片。这个枚举对象一共包含三种情况:
- photoLibray:将设备的照片库作为获取源。
- camera:将设备内置的摄像头作为获取源,如果要确定使用前置还是后置摄像头,则需要通过cameraDevice属性进行设置。
- savePhotosAlbum:将设备中的相机胶卷相册作为获取源。
最后,设置获取器的allowsEditing属性为true,它允许用户可以对选择的照片进行裁剪。
step2: 在当前VC类的声明部分,添加上面的协议(这里以UIViewController类做例子):
class XXVC:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate { }
step3:在当前VC类中添加imagePickerController(_:didFinishPickingMediaWithInfo:)协议方法:
//关联选择好的照片图像到image view
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { //从媒体信息这个字典数据中查询“原始图像”字典 img5.image = info[UIImagePickerControllerEditedImage] as? UIImage //图片填充模式:适中 img5.contentMode = .scaleToFill //超出部分裁边 img5.clipsToBounds = true //让相册选择视图退场 dismiss(animated: true, completion: nil) }
在imagePickerController(_:didFinishPickingMediaWithInfo:)方法中,我们需要做下面几件事情:
- 从参数传递进来的info字典中提取image
- 将提取出来的image赋值给avaImg对象
- 关闭照片获取器
首先,当用户在获取中选择好照片后,会将相关信息以字典(Dictionary类型)的方式作为参数发送给我们。接下来,就需要我们通过各种键名来获取到这些信息,下面介绍几个相关的键名:
- UIImagePickerControllerEditedImage:特指被用户编辑后的图像
- UIImagePickerControllerOriginalImage:特指用户选择的原始图像,未经过剪裁过的
- UIImagePickerControllerMediaURL:特指文件系统中的影片URL
- UIImagePickerControllerCropRect:特指应用到原始图像上的剪裁的矩形
- UIImagePickerControllerMediaType:特指用户选择的图像的类型。它包括kUTTypeImage(图像)和kUTTypeMovie(影片)类型
step4: 在当前VC类中添加下面的协议方法:
//用户取消获取器操作时调用的方法 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { self.dismiss(animated: true, completion: nil) }
如果用户在照片获取器中单击取消按钮,那么就关闭它。因为照片获取器默认时会占据整个屏幕,在单击取消按钮以后我们需要销毁它并返回之前调用它的当前控制器中