ios调用本地相机和相册, 非常实用的小功能, 一般做上传头像的时候会用到的比较多. 我用的是iPhone5做的测试, 没有出现什么问题. 用真机测试的主要原因是模拟器无法实现拍照功能, 拍照功能只能在真机上调用.下面是我的一些代码, 写的比较粗糙, 但是简单易懂.
// 首先来写一些委托 定义一个全局变量
@interface TestViewController : UIViewController<UIActionSheetDelegate,UIImagePickerControllerDelegate>
{
UIActionSheet *myActionSheet;
}
以上是.h中的代码, 接下来开始写.m中的 至于window创建我就不给列出了
// 首先创建一个button和一个imageView button点击调出拍照或本地相册上传图片方法, imageView负责显示图片 , 把他们都加入到view中
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100, 100, 100);
button.backgroundColor = [UIColor redColor];
[button addTarget:self action:@selector(openMenu) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
self.img = [[UIImageView alloc] initWithFrame:
CGRectMake(0, 220, self.view.frame.size.width, self.view.frame.size.height)]; // 这个imageView我设置的比较大了一点 - -
self.img.backgroundColor = [UIColor yellowColor];
[self.view addSubview:_img];
接下来是button的点击方法
-(void)openMenu
{
//这里面用的是ActionSheet
myActionSheet = [[UIActionSheet alloc]
initWithTitle:nil
delegate:self
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles: @"打开相机", @"从相册获取",nil];
[myActionSheet showInView:self.view];
}
然后是ActionSheet的代理方法 和 拍照与本地相册的调用功能实现
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
//呼出的菜单按钮点击后的响应
if (buttonIndex == myActionSheet.cancelButtonIndex)
{
NSLog(@"取消");
}
switch (buttonIndex)
{
case 0: //打开照相机拍照
[self takePhoto];
break;
case 1: //打开本地相册
[self LocalPhoto];
break;
}
}
//开始拍照
-(void)takePhoto
{
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
//设置拍照后的图片可被编辑
picker.allowsEditing = YES;
picker.sourceType = sourceType;
[self presentModalViewController:picker animated:YES];
}else
{
NSLog(@"模拟其中无法打开照相机,请在真机中使用");
}
}
//打开本地相册
-(void)LocalPhoto
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.delegate = self;
//设置选择后的图片可被编辑
picker.allowsEditing = YES;
[self presentModalViewController:picker animated:YES];
}
UIImagePickerController的代理方法:
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
//当选择的类型是图片
if ([type isEqualToString:@"public.image"])
{
//先把图片转成NSData
UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData *data;
if (UIImagePNGRepresentation(image) == nil)
{
data = UIImageJPEGRepresentation(image, 1.0);
}
else
{
data = UIImagePNGRepresentation(image);
}
//图片保存的路径
//这里将图片放在沙盒的documents文件夹中
NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
//文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
//把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png
[fileManager createDirectoryAtPath:DocumentsPath withIntermediateDirectories:YES attributes:nil error:nil];
[fileManager createFileAtPath:[DocumentsPath stringByAppendingString:@"/image.png"] contents:data attributes:nil];
//关闭相册界面
[picker dismissModalViewControllerAnimated:YES];
_img.image = image;
}
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
NSLog(@"您取消了选择图片");
[picker dismissModalViewControllerAnimated:YES];
}
这样就ok了