讀《瘋狂iOS講義(下)》筆記
UIImagePickerController拍照錄視頻選取圖片
思路
list文件需要添加:
<key>NSCameraUsageDescription</key>
<string></string>
<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string></string>
//
// ViewController.m
// ImagePickerDemo
//
// Created by on 2020/2/27.
// Copyright © 2020 Shae. All rights reserved.
//
#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import <AssetsLibrary/AssetsLibrary.h>
#import <Photos/Photos.h>
@interface ViewController ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
@end
@implementation ViewController
UIImagePickerController *picker;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"%d",testprefix);
picker=[[UIImagePickerController alloc]init];
picker.delegate=self;
}
- (IBAction)takePhoto:(UIButton *)sender {
//如果拍攝的攝像頭可用
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
//將sourceType設置爲UIImagePickerControllerSourceTypeCamera代表拍照或拍視頻
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
//設置拍照照片
picker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto;
//設置使用手機的前置攝像頭
//picker.cameraDevice=UIImagePickerControllerCameraDeviceFront;
//設置拍攝的照片允許編輯
picker.allowsEditing=YES;
}else{
NSLog(@"無法打開攝像頭");
}
//顯示picker視圖控制器
[self presentViewController:picker animated:YES completion:nil];
}
- (IBAction)takeVideo:(UIButton *)sender {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
// 將sourceType設爲UIImagePickerControllerSourceTypeCamera代表拍照或拍視頻
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
//將mediaTypes設置爲所有支持的多媒體類型
picker.mediaTypes=[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
//設置拍攝視頻
picker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;
//設置拍攝高質量的視頻
picker.videoQuality=UIImagePickerControllerQualityTypeHigh;
}else{
NSLog(@"無法打開攝像頭");
}
[self presentViewController:picker animated:YES completion:nil];
}
- (IBAction)loadPhoto:(UIButton *)sender {
//設置選擇加載相冊的圖片或視頻
picker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;//y圖片視頻
//picker.sourceType=UIImagePickerControllerSourceTypeSavedPhotosAlbum;//僅圖片
picker.allowsEditing=YES;
[self presentViewController:picker animated:YES completion:nil];
}
//當得到照片或者視頻j後,調用該委託方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info{
NSLog(@"成功:%@",info);
//獲取用戶拍攝的是照片還是視頻
NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
//判斷獲取類型:圖片,並且是剛拍攝的圖片
if ([mediaType isEqualToString:(NSString*)kUTTypeImage]&&picker.sourceType==UIImagePickerControllerSourceTypeCamera) {
UIImage *theImage=nil;
//判斷,圖片是否允許篡改
if ([picker allowsEditing]) {
//獲取用戶編輯之後的圖像
theImage=[info objectForKey:UIImagePickerControllerEditedImage];
}else{
//獲取原始的照片
theImage=[info objectForKey:UIImagePickerControllerOriginalImage];
}
//保存圖片到相冊中
UIImageWriteToSavedPhotosAlbum(theImage, self, nil, nil);
}else if ([mediaType isEqualToString:(NSString*)kUTTypeMovie]){
//獲取視頻文件的url
NSURL *mediaURL=[info objectForKey:UIImagePickerControllerMediaURL];
//將視頻保存到媒體庫
UISaveVideoAtPathToSavedPhotosAlbum(mediaURL.path,self,@selector(video:didFinishSavingWithError:contextInfo:),nil);
NSLog(@"mediaURL.path:%@",mediaURL.path);
}else if ([mediaType isEqualToString:(NSString*)kUTTypeImage]&&picker.sourceType==UIImagePickerControllerSourceTypePhotoLibrary){
//呈現選取的照片
if ([picker allowsEditing]) {
//獲取用戶編輯之後的圖像
self.loadImageView.image=[info objectForKey:UIImagePickerControllerEditedImage];
}else{
//獲取原始的照片
self.loadImageView.image=[info objectForKey:UIImagePickerControllerOriginalImage];
}
}
//隱藏UIImagePickerController
[picker dismissViewControllerAnimated:YES completion:nil];
}
// UISaveVideoAtPathToSavedPhotosAlbum 視頻保存回調
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo {
NSLog(@"%@",videoPath);
NSLog(@"%@",error);
}
//當用戶取消時,調用該代理方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
NSLog(@"用戶取消的拍攝");
//隱藏UIImagePickerController
[picker dismissViewControllerAnimated:YES completion:nil];
}
@end