【iOS】如何封装相册选择器

作者: 独酌丿红颜 | 来源:发表于2015-12-29 18:21 被阅读2356次

如何封装选择相册

IMG_1261.PNG

1.很多时候,我们都在苦恼,该如何选择相册的图片;
首先,/*** 相册选择*/ @interface SXPickPhoto :NSObject一个工具类,在这里,我将选择照片的调用系统的一系列方法进行了简单实现;

/**
 *  打开相机:
 *
 *  @param object 控制器对象
 */
- (void)ShowTakePhotoWithController: (UIViewController *)Controller
                       andWithBlock: (myblock)block;

/**
 *  选择相册
 *
 *  @param Controller 控制器对象
 */

- (void)SHowLocalPhotoWithController: (UIViewController *)Controller
                        andWithBlock: (myblock)block;

2.其中andWithBlock: (myblock)block 是我用于回调图片UIimage * image对象的,为了是代码更加清晰,我将相册和相机两个方法分开了。
下面直接上代码:

/**
 *  打开相机:
 *
 *  @param object 控制器对象
 */
- (void)ShowTakePhotoWithController: (UIViewController *)Controller
                       andWithBlock: (myblock)block
{
    //回调
    _myblock = block;
    UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
  
    if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
   
    {
        _picker.delegate = self;
     
        //设置拍照后的图片可被编辑
      
        _picker.allowsEditing = YES;
      
        _picker.sourceType = sourceType;
        
        [Controller presentViewController:_picker animated:YES completion:nil];
     
    }
    else
    {
        NSLog(@"模拟其中无法打开照相机,请在真机中使用");
    }
   
}

3.具体解释就不再赘述:

/**
 *  选择相册
 *
 *  @param Controller 控制器对象
 */
- (void)SHowLocalPhotoWithController: (UIViewController *)Controller
                        andWithBlock: (myblock)block
{
    _myblock = block;
    _picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    
    _picker.delegate = self;
    
    //设置选择后的图片可被编辑
    
    _picker.allowsEditing = YES;
    
    [Controller presentViewController:_picker animated:YES completion:nil];
}

4.因为,前面有设置代理,图片在选择完以后,会调用以下代理方法:

//当一张图片后进入这里
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
    //当选择的类型是图片
    if ([type isEqualToString:@"public.image"])
     {
         //先把图片转成NSData
        UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
         
         if (_myblock) {
             
             _myblock(image);
             
             [_picker dismissViewControllerAnimated:YES completion:nil];
         }

     }
    
}

// 取消选择照片:
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker

{
    NSLog(@"您取消了选择图片");
    [picker dismissViewControllerAnimated:YES completion:nil];
   
}

5.最后是如何使用选择相册:

#pragma mark - === 提示框 ===
- (void)aleShowView
{
    
    UIAlertAction * act1 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        
        
    }];
    //拍照:
    UIAlertAction * act2 = [UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
       //打开相机
        [_pickPhoto ShowTakePhotoWithController:self andWithBlock:^(NSObject *Data) {
           
            if ([Data isKindOfClass:[UIImage class]])
            {
                _imageView.image = (UIImage *)Data;
            }
          
        }];
        
    }];
    //相册
    UIAlertAction * act3 = [UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
        //打开相册
        [_pickPhoto SHowLocalPhotoWithController:self andWithBlock:^(NSObject *Data) {
            if ([Data isKindOfClass:[UIImage class]])
            {
                _imageView.image = (UIImage *)Data;
            }
        }];
        
    }];
    
    UIAlertController * aleVC = [UIAlertController alertControllerWithTitle:@"提示" message:@"选择图片" preferredStyle:UIAlertControllerStyleActionSheet];
    [aleVC addAction:act1];
    [aleVC addAction:act2];
    [aleVC addAction:act3];
    
    [self presentViewController:aleVC animated:YES completion:nil];
}

相关文章

网友评论

  • 阿龍飛: _imageView.image = (UIImage *)Data;
    不用weakself么
    独酌丿红颜:@阿龍飛 注意循环引用的问题就好了
    阿龍飛:@独酌丿红颜 block中的block♻️不会有问题吧?
    独酌丿红颜:应该用的,demo就没写了
  • Wang66:正在总结整理这块的东西,楼主封装地不错。
  • 5c9bcc4a2d48:楼主,我的意思拍完照之后会出现一个方框,这个方框固定在了图片的一个位置,比如我想截取照片下面一点的图像,没法做到。 感谢楼主的分享哈
  • 5c9bcc4a2d48:@林神之swift之路 是拍好的照片,编辑的时候 没办法移动,只能固定在一个地方
    独酌丿红颜:@林神之swift之路 忘记更新了。你再看下http://pan.baidu.com/s/1dEAL2e9
  • 5c9bcc4a2d48:楼主,我发现用你的Demo 最后拿到的图片 并不是被编译后截取过的 那张 请问 是截图有问题吗
  • 名扬丶四海:楼主,我也发现了3楼所说的问题,求解
    名扬丶四海:@独酌丿红颜 好的,谢谢
    独酌丿红颜:需要遵守这两个协议 ,
    UIImagePickerControllerDelegate,UINavigationControllerDelegate,这里有链接地址 http://pan.baidu.com/s/1kUg3xB5
  • iOS程序犭袁:学习下
  • a84d278a5de4:感谢分享:kissing_heart:
  • i_Leechee:你好,我按照你的思路自己写了一个demo,发现在SXPickPhoto这个工具类里,UIImagePickerController的代理方法不走,找不到原因,能看您的demo吗
    i_Leechee:@独酌丿红颜 在吗,求demo :kissing_heart:
    i_Leechee:@独酌丿红颜 谢谢 :smiley:
    独酌丿红颜:@LiJianxin 好的,晚上给你链接…
  • 曾樑:大部分应用都会用到

本文标题:【iOS】如何封装相册选择器

本文链接:https://www.haomeiwen.com/subject/jylihttx.html