在App开发中,我们经常涉及到的一个简单而常用的功能就是调用系统相机相册,上传个人头像。这个功能也不怎么复杂,调用系统API,实现其简单功能即可。然而我却在开发中遇到了一个略显尴尬的问题:在iphone上调用相机和相册没有任何问题。但是在ipad上,相同的代码,只有第一次调用相机或者相册时可以调起,之后就调不起来了。
以下晒出我的代码:
1. 调用相机
- (void) getCarpitueFromViewController:(UIViewController*)vc selectedImage:(void(^)(UIImage*image))imageBlock{
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
[SVProgressHUD showErrorWithStatus:NSLocalizedString(@"设备不支持照相", nil)];
return;
}
UIImagePickerController *pick = [[UIImagePickerController alloc] init];
pick.delegate=self;
pick.sourceType = UIImagePickerControllerSourceTypeCamera;
pick.allowsEditing = YES;
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status == AVAuthorizationStatusAuthorized) {
NSString*blockKey = [NSStringstringWithFormat:@"Block%@", pick];
[self.imageBlockDictsetObject:imageBlockforKey:blockKey];
dispatch_async(dispatch_get_main_queue(), ^{
[vc presentViewController:pick animated:FALSE completion:nil];
});
}else if (status == AVAuthorizationStatusNotDetermined) {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
NSString*blockKey = [NSString stringWithFormat:@"Block%@", pick];
[self.imageBlockDictsetObject:imageBlockforKey:blockKey];
dispatch_async(dispatch_get_main_queue(), ^{
[vc presentViewController:pick animated:FALSE completion:nil];
});
}];
}else{
[SVProgressHUD showErrorWithStatus:NSLocalizedString(@"到设置中设置相机权限", nil)];
}
}
2. 调用相册
- (void)getPhotoLibraryFromViewController:(UIViewController*)vc selectedImage:(void(^)(UIImage*))imageBlock{
UIImagePickerController *imagePick = [[UIImagePickerController alloc] init];
imagePick.delegate=self;
imagePick.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePick.allowsEditing=YES;
[self.imageBlockDictsetObject:imageBlockforKey:[NSStringstringWithFormat:@"Block%@", imagePick]];
dispatch_async(dispatch_get_main_queue(), ^{
[vc presentViewController:imagePick animated:FALSE completion:nil];
});
}
大家都看到了,代码相当简单。最后在ipad上调不起相机相册的问题还是解决了。(问了开发群的很多伙伴,也在网上查了很多资料),你会问我最终是怎么解决的呢?
不知道大家有没有注意下面这句代码
dispatch_async(dispatch_get_main_queue(), ^{
[vc presentViewController:imagePick animated:FALSE completion:nil];
});
没错,关键之处就是这句代码。在 iphone 应用上,[vc presentViewController:imagePick animated:FALSE completion:nil];这样写没有任何问题。但是在ipad上,必须按照上面那样写,才不会出现首次调用相机或者相册之后再也调用不起的问题。即:必须在异步回到主线程的方法中弹出imagePick. 我最后想了:ipad、异步、主线程好像没有什么关联,也许有关联,本人现在还没有想到吧。虽然问题解决了,但还是不知道为什么。
在开发群也遇到过其他同学有这个问题,还是上面这样解决的,但是也不知道所以然。我把这个问题记录下来:1.以后遇到这个问题,就知道如何解决了。2. 如果有哪位伙伴知道这样解决问题的原因,请务必告诉我哦。知识在于分享,技术在于交流,大家共同学习,共同进步。