文章目录
  1. 1. 前言
  • 系统相册和相机
    1. 1. 相册
    2. 2. 拍照
    3. 3. 摄像
  • 前言


    在开发过程,项目可能会用到手机中的一个图片,比如头像、截图等。可喜的是 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:^{ }];
    文章目录
    1. 1. 前言
  • 系统相册和相机
    1. 1. 相册
    2. 2. 拍照
    3. 3. 摄像