美文网首页技术其他技巧iOS 多媒体
iOS开发笔记---选取系统相册照片

iOS开发笔记---选取系统相册照片

作者: koreadragon | 来源:发表于2015-12-08 20:47 被阅读14295次
    在开发中我们经常遇到要调用系统相册,比如给联系人设置头像,聊天时给好友发送照片等。下面就看下如何调取系统相册。

    一般调用事件的实现都是通过点击一个按钮来实现的,那么我们首先创建一个button:

    UIButton *chooseButton = [UIButton buttonWithType:UIButtonTypeSystem];    
    [chooseButton setFrame:CGRectMake(100, 100, 200, 200)];
    [self.view addSubview:chooseButton];
    chooseButton.tag = 1004;
    chooseButton.center = self.view.center;//让button位于屏幕中央
    [chooseButton setImage:[[UIImage imageNamed:@"123.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ] forState:UIControlStateNormal];
        
    [chooseButton addTarget:self action:@selector(selectImage) forControlEvents:UIControlEventTouchDown];
    

    这里需要注意的是如果在创建button时选择的类型不是UIButtonTypeCustom而是系统类(UIButtonTypeSystem)的话,在给按钮添加照片时会被系统默认渲染,导致无法看到照片。这里就需要在设置照片时使用如下方法:
    [chooseButton setImage:[[UIImage imageNamed:@"123.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ] forState:UIControlStateNormal];
    

    其中 UIImageRenderingModeAlwaysOriginal的意思是一直使用照片原始状态,也就是不需要渲染,这样的话就可以显示所设置的照片了。不过最好 在创建button时直接选择UIButtonTypeCustom,免得麻烦。


    OK,button创建好了,target事件也添加了。接下来我们就要实现它的点击事件了:

    实现button点击事件的回调方法
    - (void)selectImage{
    
        //调用系统相册的类
        UIImagePickerController *pickerController = [[UIImagePickerController alloc]init];
    
        
        //设置选取的照片是否可编辑
        pickerController.allowsEditing = YES;
        //设置相册呈现的样式
        pickerController.sourceType =  UIImagePickerControllerSourceTypeSavedPhotosAlbum;//图片分组列表样式
        //照片的选取样式还有以下两种   
        //UIImagePickerControllerSourceTypePhotoLibrary,直接全部呈现系统相册
        //UIImagePickerControllerSourceTypeCamera//调取摄像头
        
        //选择完成图片或者点击取消按钮都是通过代理来操作我们所需要的逻辑过程
        pickerController.delegate = self;
        //使用模态呈现相册
        [self.navigationController presentViewController:pickerController animated:YES completion:^{
      
        }];
     
    }
    

    上面代码中有提到,照片选择完成或者进去之后点击取消按钮都是通过代理来实现的,如果我们不去实现点击完成之后的方法,系统就没法往下走,会卡在照片界面。所以我们最起码要实现选取和点击取消按钮后的代理方法。

    //选择照片完成之后的代理方法
    
    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
        
        //info是所选择照片的信息
        
    //    UIImagePickerControllerEditedImage//编辑过的图片
    //    UIImagePickerControllerOriginalImage//原图
        
        
        NSLog(@"%@",info);
        //刚才已经看了info中的键值对,可以从info中取出一个UIImage对象,将取出的对象赋给按钮的image
        
        UIButton *button = (UIButton *)[self.view viewWithTag:1004];
        
        UIImage *resultImage = [info objectForKey:@"UIImagePickerControllerEditedImage"];
        [button setImage:[resultImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]forState:UIControlStateNormal];//如果按钮创建时用的是系统风格UIButtonTypeSystem,需要在设置图片一栏设置渲染模式为"使用原图"
        
        
        //裁成边角
        button.layer.cornerRadius = 100;
        button.layer.masksToBounds = YES;
        
        //使用模态返回到软件界面
        [self.navigationController dismissViewControllerAnimated:YES completion:nil];
     
    }
    
    

    点击取消按钮所执行的方法

    //点击取消按钮所执行的方法
    
    -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
        
        
       //这是捕获点击右上角cancel按钮所触发的事件,如果我们需要在点击cancel按钮的时候做一些其他逻辑操作。就需要实现该代理方法,如果不做任何逻辑操作,就可以不实现
        [self.navigationController dismissViewControllerAnimated:YES completion:nil];
        
    }
    
    

    上面用到了一个知识点,就是给button设置圆形的图片,这在iOS中很常见,方法很简单,如下:
    //裁成边角 button.layer.cornerRadius = 100; button.layer.masksToBounds = YES;
    这里注意设置裁剪时的半径设置。要设置为button宽度一半才是圆形,如果是其他数据的话出来就是奇形怪状了。

    这里补充下个人对裁取半径的认识。因为手误出现了各种形状,所以稍作了分析。
    就拿button来说,默认给它设置前景照片时就是矩形的,跟button本身结构一样,其实cornerRadius是单纯针对边角的裁切,其原理就是用一个我们给定半径的圆去裁边角,而方形边是不会去动它的(当然,是有四个圆去裁边角的)。

    每个边角用小圆来裁切

    当设置的button.layer.cornerRadius值为正方形宽度一半时,这四个圆刚好重叠,都在正方形正中心,裁出来的也就是个标准圆。

    四个圆重叠

    例如我们设置的button是个正方形,边长为200,看一下几种设置的对比:看图比较直观一点:
    1.设置button.layer.cornerRadius = 100;
    我们看到裁出的刚好是个圆形。

    设置裁取半径等于边框一半

    2.设置button.layer.cornerRadius = 50;
    我们可以先猜测一下,它应该只是针对照片的边角修饰了一下,更圆润了,但主体还是个方形。

    设置裁取半径小于边框一半

    3.设置button.layer.cornerRadius = 150;
    这下它裁的就比较过分了,直接变形了

    设置裁取半径超过边框一半

    2015/12/09更新
    昨天漏掉了一个东西,选取照片的这个视图控制器需要遵从两个协议,才能正常执行。
    <UINavigationControllerDelegate, UIImagePickerControllerDelegate>

    相关文章

      网友评论

      • 天空当被子:圆角实现原理讲的很棒👍
      • JopYin:我想调取摄像头拍照 pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;用这句就崩在这里是什么原因
        koreadragon:如果是模拟器,确实会崩溃,如果是iOS10真机崩溃。那就在infoPlist文件中加一条key:Privacy - Camera Usage Description,内容写请求访问相机之类的就行
      • Roader:请问, 如果是一个自定义的collectionViewCell里的button,我点击这个button要选择照片并显示在button上该怎么做呢?没法调用self present啊?
        koreadragon:@Longroader 用button 的setImage 方法啊
        Roader:@koreadragon 我一开始从xib里把button拖出来添加成属性,在finish方法里拿到选好的图片,却一直没法赋值给button。后来在添加一个image view,再把button背景色搞成透明盖在上面,这样我每次点击button选照片,选完后拿到图片赋值给imageview。这样就可以了,猜测是button不支持动态添加图片。不知道是不是我自己哪一步做错了,这样解决是不是绕了大弯子?
        koreadragon:首先,你在初始化cell的时候要给cell上的button添加点击事件,addtarget,然后在这个点击事件里你要用拿到button,然后直接present出选择照片界面,在finish事件里面。你想办法把那个button传过来,或者通过tag值获取也行,然后赋值并reloadData
      • 我唔知啊:谢谢分享
      • a7fe63ad14b3:楼主 我想知道 那个怎么给选择好的图片命名呢?
        koreadragon:@大伟伟 给图片命名?你是指在什么地方用照片
      • 4660990f2c28:请问,我调用系统相机相册,但是照片裁剪框是正方形的,我想设置成圆形,该怎么做?
        koreadragon:@红颜本祸水丶何苦再留念 裁剪是确定外观大小,然后最最终让他显示出来还是要靠maskToBounds以及裁取半径的
        4660990f2c28:在进入相册或者拍照完成后,进入裁剪图片的页面,裁剪框是正方形得,我需要把它变成圆形。
        koreadragon:@红颜本祸水丶何苦再留念 不太懂你意思,我上面介绍的方法不就是让照片显示为圆形的么?
      • 白牛桑:你好,如果我想要批量选择相册中的图片,该怎么做呢
        Jennifer_鑫:@白牛桑 亲,你找到了比较方便的三方库了吗?
        在没老之前:@少年你在哪里 你好,能推荐好用的多选图片的第三方库嘛?
        HarrisHan:@白牛桑 用第三方库

      本文标题:iOS开发笔记---选取系统相册照片

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