在开发中我们经常遇到要调用系统相册,比如给联系人设置头像,聊天时给好友发送照片等。下面就看下如何调取系统相册。
一般调用事件的实现都是通过点击一个按钮来实现的,那么我们首先创建一个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>