UIImagePickerController

系统提供用来获取图片和或视频的接口,获取图片步奏如下:

  • 初始化UIImagePickerController类
  • 设置UIImagePickerController实例的数据来源(三种)
      typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
          UIImagePickerControllerSourceTypePhotoLibrary, //  图库
          UIImagePickerControllerSourceTypeCamera,  //  相机
          UIImagePickerControllerSourceTypeSavedPhotosAlbum  //  相册
      } __TVOS_PROHIBITED;
    
  • 设置UIImagePickerController实例的代理
  • 设置是否允许编辑图片allowsEditing
  • 设置完UIImagePickerController实例属性之后,在需要获取图片时要跳转到图像选取控制器当中去选取或拍摄图片

    回调如下

  • 完成图片保存到相册后,回调的相关方法,查看是否保存成功
      - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
      if(error){
          [[Toast makeText:LOCALIZATION(@"保存失败")] show];
      } else {
          [[Toast makeText:LOCALIZATION(@"已保存到系统相册")] show];
      }
      }
    
  • 取消选取调用的方法

      - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
              [self dismissViewControllerAnimated:YES completion:nil];
          }
    
  • 完成图片选取后调用的方法

      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
      //  设置不同key值获取不同情况下的图片
      UIImage *theSelectImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];  //  根据字典的key值来选取图片具体如下点
      theSelectImage = [UIImage fixOrientation:theSelectImage];
      __weak typeof(self)weakSelf = self;
      [picker dismissViewControllerAnimated:YES completion:^{
    
      }];
      }
    
    • 不同的key值获取到的不同内容(拍照和相册中的info有所不同)

        // info dictionary keys
      
        //  1、返回的是图片还是视频
        UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType __TVOS_PROHIBITED;      // an NSString (UTI, i.e. kUTTypeImage)
        //  通过UIImagePickerControllerMediaType判断返回的是照片还是视频    
        NSString* type = [info objectForKey:UIImagePickerControllerMediaType];
        //  如果返回的type等于kUTTypeImage,代表返回的是照片,并且需要判断当前相机使用的sourcetype是拍照还是相册    
        if ([type isEqualToString:(NSString*)kUTTypeImage]&&picker.sourceType==UIImagePickerControllerSourceTypeCamera) {
      
        }
        //  kUTTypeImage在<MobileCoreServices/MobileCoreServices.h> 下
      
        //  2、获取原图
        UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage __TVOS_PROHIBITED;  // a UIImage
        //  获取原图
        UIImage *original = [info objectForKey:UIImagePickerControllerOriginalImage];
      
        //  3、裁剪框中的图片
        UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage __TVOS_PROHIBITED;    // a UIImage
        //  裁剪框中的图片
        UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
      
        //  4、裁剪的图片在原图中的CGRect,返回的是NAValue
        UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect __TVOS_PROHIBITED;       // an NSValue (CGRect)
        //  裁剪的图片在原图中的CGRect,返回的是NAValue
        CGRect rect = [[info objectForKey:UIImagePickerControllerCropRect] CGRectValue];
        CGRectValue在#import <Foundation/Foundation.h>下
      
        //  5、获取图片的url
        UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL __TVOS_PROHIBITED;       // an NSURL
        //  获取图片的url
        NSURL* url = [info objectForKey:UIImagePickerControllerMediaURL];
      
        //  6、还不知道
        UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL        NS_AVAILABLE_IOS(4_1) __TVOS_PROHIBITED;  // an NSURL that references an asset in the AssetsLibrary framework
        //  
        NSURL* url = [info UIImagePickerControllerReferenceURL];
      
        //  7、返回拍照图片的内容,返回的是字典(相册中获取的没有)
        UIKIT_EXTERN NSString *const UIImagePickerControllerMediaMetadata       NS_AVAILABLE_IOS(4_1) __TVOS_PROHIBITED;  // an NSDictionary containing metadata from a captured photo
        //  图片的数据(返回的是字典)只有照相的dic有内容,相册为dic = nil
        NSDictionary *dic = [info objectForKey:UIImagePickerControllerMediaMetadata];
      
        //  8、还不知道
        UIKIT_EXTERN NSString *const UIImagePickerControllerLivePhoto NS_AVAILABLE_IOS(9_1) __TVOS_PROHIBITED;  // a PHLivePhoto
      

代码如下

    //  打开图库
    - (void)photoButtonAction:(UIButton *)button {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        //  设置UIImagePickerController实例的数据来源为图库
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        //  设置代理
        picker.delegate = self;
        //设置选择后的图片不可编辑
        picker.allowsEditing = NO;
        [self presentViewController:picker animated:YES completion:^{

        }];
    }
    //  打开相机,要注意判断是否支持相机
    - (void)takePhotoButtonAction:(UIButton *)button {
    UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; //  设置UIImagePickerController实例的数据来源为相机
    //  判断是否支持相机
    if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
        //  实例化
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        //  设置代理
        picker.delegate = self;
        //设置拍照后的图片可被编辑
        picker.allowsEditing = YES;
        picker.sourceType = sourceType;
        [self presentViewController:picker animated:YES completion:^{

        }];
    } else {
        NSLog(@"模拟器其中无法打开照相机,请在真机中使用");
    }
    }
    //  保存图片到本地
    - (void)saveButtonAction:(ScannerSmallImageButton *)button {
    //  图片存入本地(回调方法格式固定)
    UIImageWriteToSavedPhotosAlbum(theNeedSaveImage, self(指pickControl的代理), @selector(image:didFinishSavingWithError:contextInfo:), NULL);
    }
    - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {

    if(error) {
        [[Toast makeText:LOCALIZATION(@"保存失败")] show];
    } else {
        [[Toast makeText:LOCALIZATION(@"已保存到系统相册")] show];
    }
    }

判断设备是否支持数据源

     typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
        UIImagePickerControllerSourceTypePhotoLibrary, //  图库
        UIImagePickerControllerSourceTypeCamera,  //  相机
        UIImagePickerControllerSourceTypeSavedPhotosAlbum  //  相册
    } __TVOS_PROHIBITED;

    //  判断是否支持相机,在打开相机时需要进行判断
    if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
    }

    //  判断是否支持图库
    if( [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary]) {
    }

    //  判断是否支持相册
    if( [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
    }

    //  设置数据源
    pickerController.sourceType = UIImagePickerControllerSourceType;

判断设备是否支持前、后摄像头

        typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
        UIImagePickerControllerCameraDeviceRear,  //  后摄像头
        UIImagePickerControllerCameraDeviceFront  //  前摄像头
    } __TVOS_PROHIBITED;

    //  判断是否支持前摄像头
        if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) {

    }

    //  判断是否支持后摄像头
        if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]) {

    }

    //  设置前摄像头
    pickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront;

    //  设置后摄像头
    pickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear;

返回前摄像头/后摄像头拍摄的类型

    //  摄像头类型
    typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
    UIImagePickerControllerCameraDeviceRear, // 后摄像头闪光灯
    UIImagePickerControllerCameraDeviceFront // 前摄像头闪光灯
    } __TVOS_PROHIBITED;

    //  返回类型
    typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraCaptureMode) {
    UIImagePickerControllerCameraCaptureModePhoto, //  照片
    UIImagePickerControllerCameraCaptureModeVideo  //  视频
    } __TVOS_PROHIBITED;

判断设备是否支持前摄像头闪光灯、后摄像头闪光灯

只要相机设备支持闪光灯和手电就会返回YES

    typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
        UIImagePickerControllerCameraDeviceRear, //  后摄像头闪光灯
        UIImagePickerControllerCameraDeviceFront  //  前摄像头闪光灯
    } __TVOS_PROHIBITED;

    typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraFlashMode) {
    UIImagePickerControllerCameraFlashModeOff  = -1, // 关
    UIImagePickerControllerCameraFlashModeAuto = 0, //  自动
    UIImagePickerControllerCameraFlashModeOn   = 1 //  开
    } __TVOS_PROHIBITED;

    //  要相机设备支持闪光灯和手电就会返回YES
    //  判断是否支持前摄像头闪光灯
        if([UIImagePickerController isFlashAvailableForCameraDevice:UIImagePickerControllerCameraDeviceRear]) {

    }

    //  判断是否支持后摄像头闪光灯
        if([UIImagePickerController isFlashAvailableForCameraDevice:UIImagePickerControllerCameraDeviceFront]) {

    }

    //  设置闪光灯的情况,在拍照的时候才会闪
    //  不开闪光灯
    picker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
    //  暗的时候自动开启,亮的时候不开启
    picker.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;
    //  开
    picker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;

results matching ""

    No results matching ""