前言
在iOS中要拍照和录制视频最简单的方式就是调用UIImagePickerController,UIImagePickerController继承与UINavigationController,需要使用代理方法时需要同时遵守这两个协议
下面我们做代码前的准备
版本宏
#define iOS7Later ([UIDevice currentDevice].systemVersion.floatValue >= 7.0f)
#define iOS8Later ([UIDevice currentDevice].systemVersion.floatValue >= 8.0f)
#define iOS9Later ([UIDevice currentDevice].systemVersion.floatValue >= 9.0f)
#define iOS9_1Later ([UIDevice currentDevice].systemVersion.floatValue >= 9.1f)
你需要对info.plist进行配置

Privacy - Photo Library Usage Description --- 打开相册可以吗?
Privacy - Camera Usage Description ---
Privacy - Location Always Usage Description ----
Privacy - Location When In Use Usage Description ---
实现上面部分之后,开始显示代码部分
代码部分
@property(nonatomic, strong)UIImagePickerController *imagePickerController;//初始化imagePickerController
点击事件实现相机调用私有方法
- (IBAction)photoBtnClick:(UIButton *)sender {
[self selectImageFromAlbum];
}
调用本地相册
- (void)selectImageFromAlbum
{
//NSLog(@"相册");
_imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:_imagePickerController animated:YES completion:nil];
}
#pragma mark UIImagePickerControllerDelegate
//该代理方法仅适用于只选取图片时
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo {
NSLog(@"选择完毕----image:%@-----info:%@",image,editingInfo);
}
//适用获取所有媒体资源,只需判断资源类型
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
//判断资源类型
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]){
// //如果是图片
self.imageView.image = info[UIImagePickerControllerEditedImage];
//压缩图片
NSData *fileData = UIImageJPEGRepresentation(self.imageView.image, 1.0);
//保存图片至相册
UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
//上传图片
// [self uploadImageWithData:fileData];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark 图片保存完毕的回调
- (void) image: (UIImage *) image didFinishSavingWithError:(NSError *) error contextInfo: (void *)contextInf{
}
#pragma mark 视频保存完毕的回调
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInf{
if (error) {
NSLog(@"保存视频过程中发生错误,错误信息:%@",error.localizedDescription);
}else{
NSLog(@"视频保存成功.");
}
}
下面实现照相机拍照代码
#pragma mark 照相机拍照
-(void)photoByCamera
{
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if ((authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied) && iOS7Later) {
} else { // 调用相机
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
/*隐藏tabar*/
self.viewController.tabBarController.tabBar.hidden = YES;
self.imagePickerController.sourceType = sourceType;
if(iOS8Later) {
self.imagePickerController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
}
[self.viewController presentViewController:self.imagePickerController animated:YES completion:nil];
} else {
NSLog(@"模拟器中无法打开照相机,请在真机中使用");
}
}
}
本人个人微信公众号地址(喜欢记得关注😯)

网友评论