一、從圖冊中獲取本地圖片和視頻
從圖冊中獲取文件,我們使用的是UIImagePickerController
,這個類我們在之前的攝像頭中使用過,這里是鏈接:iOS學習筆記27-攝像頭,這里我們使用的是它的另外一個功能,那就是從圖冊中獲取圖片和視頻
基本步驟:
- 創建
UIImagePickerController
對象,并設置代理
- 設置拾取源為圖冊,設置可編輯屬性
- 如果只是獲取圖片,就設置圖片的媒體類型,如果只是獲取視頻,就設置視頻的媒體類型,如果兩者都要獲取,就設置兩者的媒體類型(實例采用)
- 彈出圖片選擇控制器
- 處理圖片選擇控制器的代理方法
下面是使用實例:
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
@interface ViewController () <UINavigationControllerDelegate,
UIImagePickerControllerDelegate>
@property (strong, nonatomic) UIImagePickerController *ipc;/* 相冊選擇器 */
@property (strong, nonatomic) AVPlayerViewController *playerVC;/* 視頻播放器 */
@property (weak, nonatomic) IBOutlet UIImageView *showImageView;/* 顯示圖片 */
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//設置顯示圖片可交互
self.showImageView.userInteractionEnabled = YES;
//創建AVPlayerViewController控制器
AVPlayerViewController *playerVC = [[AVPlayerViewController alloc] init];
playerVC.view.frame = self.showImageView.bounds;
[self.showImageView addSubview:playerVC.view];
self.playerVC = playerVC;
self.playerVC.view.hidden = YES;
}
#pragma mark - UI點擊
/* 點擊打開本地相冊 */
- (IBAction)pickImage:(id)sender
{
//如果正在播放視頻,停止播放
if (self.playerVC.player) {
[self.playerVC.player pause];
}
//創建圖片選擇控制器
UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
//設置拾取源類型
ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//設置媒體類型,這里設置圖冊支持的所有媒體類型,圖片和視頻
ipc.mediaTypes =
[UIImagePickerController availableMediaTypesForSourceType:ipc.sourceType];
ipc.delegate = self;//設置代理
ipc.allowsEditing = YES;//設置可編輯
self.ipc = ipc;
//彈出圖片選擇控制器
[self presentViewController:ipc animated:YES completion:nil];
}
#pragma mark - UIImagePickerControllerDelegate代理方法
/* 選擇了一個圖片或者視頻后調用 */
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
//獲取選擇文件的媒體類型
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
NSURL *videoURL = nil;
if ([mediaType isEqualToString:@"public.image"]){//選擇了圖片
//獲取選擇的圖片
UIImage *selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage];
//顯示圖片
self.showImageView.image = selectedImage;
self.showImageView.contentMode = UIViewContentModeScaleAspectFill;
NSLog(@"found an image %@",selectedImage);
//刪除視頻
self.playerVC.player = nil;
self.playerVC.view.hidden = YES;
} else if ([mediaType isEqualToString:@"public.movie"]){//選擇了視頻
//獲取臨時保存視頻的URL
videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
NSLog(@"found a video %@",videoURL);
//直接創建AVPlayer,它內部也是先創建AVPlayerItem,這個只是快捷方法
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
self.playerVC.player = player;
self.playerVC.view.hidden = NO;
}
[self dismissViewControllerAnimated:YES completion:^{
if (videoURL) {
//調用控制器的屬性player的開始播放方法
[self.playerVC.player play];
}
}];
}
/* 取消選擇后調用 */
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self dismissViewControllerAnimated:YES completion:^{
//取消選擇后繼續播放視頻
if (self.playerVC.player) {
[self.playerVC.player play];
}
}];
NSLog(@"取消選擇");
}
@end
Demo代碼點這里:learnDemo里面的PickerTest
獲取視頻的時候,會有一個拷貝圖冊里的視頻文件到本地沙盒tmp路徑下的過程,需要等待拷貝完成,才會調用代理方法。
這一節屬于知識補充,就沒有很多新內容,大部分內容之前講過。