前言
在开发过程,项目可能会用到手机中的一个图片,比如头像、截图等。可喜的是 iOS 系统允许第三方应用通过 UIImagePickerController 类浏览相册和使用相机应用功能,满足项目的需求。需要向系统申请相机和拍照权限,征得用户的同意,方能使用此功能。
1 2 3 4
| <key>NSPhotoLibraryUsageDescription</key> <string>访问相册</string> <key>NSCameraUsageDescription</key> <string>访问相机</string>
|
系统相册和相机
首先将 UIimagePickerController 进行初始化,并遵循 UIImagePickerControllerDelegate、UINavigationControllerDelegate(可选) 协议,实现这两个协议方法。
1 2
| - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info; - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
|
相册
1 2 3 4 5 6 7 8 9
| UIImagePickerController * imgPic = [[UIImagePickerController alloc] init]; //指定图片源类型(Library 或 Album) imgPic.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; //imgPic.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; //遵循 协议,设置代理 imgPic.delegate = self; //模态推出 [self presentViewController:imgPic animated:YES completion:^{}];
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #pragma mark--协议 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ /* 图片 { UIImagePickerControllerCropRect = "NSRect: {{0, 292}, {750, 750}}"; UIImagePickerControllerEditedImage = "<UIImage: 0x137205f00> size {750, 750} orientation 0 scale 1.000000"; UIImagePickerControllerMediaType = "public.image"; UIImagePickerControllerOriginalImage = "<UIImage: 0x137202810> size {750, 1334} orientation 0 scale 1.000000"; UIImagePickerControllerReferenceURL = "assets-library://asset/asset.PNG?id=A9B0F6F8-5D11-48EE-80AF-2BB6B850EC5C&ext=PNG"; } */
//1、首先判断媒体的类型 if ([info[UIImagePickerControllerMediaType] isEqualToString:(NSString *)kUTTypeImage]) { /* info[UIImagePickerControllerCropRect] //编辑时选取图片的位置 info[UIImagePickerControllerEditedImage] //编辑图片的对象 info[UIImagePickerControllerMediaType] //媒体的类型(视图 或者 图片) info[UIImagePickerControllerOriginalImage] //原始图片的对象 info[UIImagePickerControllerReferenceURL] //图片的位置 */ UIImage * originImg = info[UIImagePickerControllerOriginalImage]; //对其进行压缩 NSData * scaleImgData = UIImageJPEGRepresentation(originImg, 0.8); }else{ } [self dismissViewControllerAnimated:picker completion:^{ }]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{ [self dismissViewControllerAnimated:picker completion:^{ }]; }
|
注意:无论选择还是取消,最后都要在协议里执行 dismissViewControllerAnimated:completion: 方法销毁 picker 对象。
拍照
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| UIImagePickerController * takePhotos = [[UIImagePickerController alloc] init]; takePhotos.delegate = self; //若未指定,默认是调用相册类型 takePhotos.sourceType = UIImagePickerControllerSourceTypeCamera; //判读是否支持相机拍照 if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { //检测硬件设备 (前后摄像头) /* UIImagePickerControllerCameraDeviceRear, // 后摄像头 UIImagePickerControllerCameraDeviceFront // 前摄像头 */ if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]) { //指定拍照源 takePhotos.cameraDevice = UIImagePickerControllerCameraDeviceFront; } else { } //设置是否允许编辑 takePhotos.allowsEditing = YES; [self presentViewController:takePhotos animated:YES completion:^{ }]; }else{ }
|
摄像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| UIImagePickerController * pickerC = [[UIImagePickerController alloc] init]; pickerC.delegate = self; pickerC.sourceType = UIImagePickerControllerSourceTypeCamera; pickerC.cameraDevice = UIImagePickerControllerCameraDeviceRear; pickerC.allowsEditing = YES; //显示图片和视频两个选项 //pickerC.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; //光显示视频 pickerC.mediaTypes = @[(NSString *)kUTTypeMovie]; pickerC.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo; //视频质量 pickerC.videoQuality = UIImagePickerControllerQualityTypeHigh; //隐藏系统UI default yes pickerC.showsCameraControls = YES; //在相机视图上添加一层视图 UIView * overlayVw = [[UIView alloc] initWithFrame:CGRectMake(0, 100, self.view.bounds.size.width, 10)]; overlayVw.backgroundColor = [UIColor redColor]; pickerC.cameraOverlayView = overlayVw; //相机层视图旋转 //pickerC.cameraViewTransform = CGAffineTransformMakeRotation(M_PI / 2); //缩放 //pickerC.cameraViewTransform = CGAffineTransformMakeScale(0.8, 0.5); [self presentViewController:pickerC animated:YES completion:^{ }];
|