相册和相机的加载
// 里面预制了和系统设备资源相关的常量和一些参数
#import <MobileCoreServices/MobileCoreServices.h>
// 看某个资源是否可用
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
[self loadImagePickeWithSourceType:UIImagePickerControllerSourceTypeCamera];
}
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
[self loadImagePickeWithSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
// 系统封装好的加载相机、相册库的类
UIImagePickerController * picker = [[UIImagePickerController alloc]init];
// 加载不同的资源
picker.sourceType = type;
// 是否允许picker对图片资源进行优化
picker.allowsEditing = YES;
// 设置代理
picker.delegate = self;
// 软件中习惯通过present方式呈现相册库
[self presentViewController:picker animated:YES completion:^{
}];
}
// 点击cancel按钮的时候,调用此方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
// 点击choose按钮,触发此方法
// info 带有选中资源信息
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
// 获取资源类型
NSString * mediaType = [info objectForKey:UIImagePickerControllerMediaType];
// kUTTypeImage 代表图片资源类型
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
// 手机拍摄的照片大概在两兆左右,甚至更大,拿到程序中对图片进行频繁处理之前,需要对图片进行装换,否则很容易引起内存溢出(在模拟器运行可以,在真机容易溢出内存) 程序被操作系统杀掉
// 直接拿到选中的图片
UIImage * image = [info objectForKey:UIImagePickerControllerEditedImage];
// 对图片进行处理 借助第三方库
UIImage * smallImage = [[ImageTool shareTool] resizeImageToSize:CGSizeMake(320, 480) sizeOfImage:image];
// 渲染图片
self.view.backgroundColor = [UIColor colorWithPatternImage:smallImage];
}
[picker dismissViewControllerAnimated:YES completion:^{
}];
// 音频播放
// 里面预制了音频播放器和视频播放器
#import <AVFoundation/AVFoundation.h>
NSString * path = [[NSBundle mainBundle] pathForResource:@"song1" ofType:@"mp3"];
if (path.length == 0) {
NSLog(@"没有读到资源");
return;
}
// fileURLWithPath 本地资源路径,调用次方法
NSURL * url = [NSURL fileURLWithPath:audioPath];
if (_audioPlayer) {
_audioPlayer = nil;
}
_audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
// 设置代理
_audioPlayer.delegate = self;
// 播放前预处理
[_audioPlayer prepareToPlay];
// 播放
[_audioPlayer play];
// 停止播放
- (void)stopAudioPlayer
{
if (_audioPlayer) {
[_audioPlayer stop]; // 停止播放
_audioPlayer = nil;
}
}
// 一首歌播放完成之后,调用此方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
// 当操作系统级别的功能个介入(短信,电话),播放器被打段时,调用此方法
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
// 结束被打断时调用
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags
{
if (player) {
[player play]; // 播放和继续播放
}
}
// 视频播放
#import <MediaPlayer/MediaPlayer.h>
NSString * path = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp4"];
if (path.length == 0) {
NSLog(@"没有找到资源");
return;
}
NSURL * url;
// https 更安全的HTTP协议
if ([path rangeOfString:@"http://"].location != NSNotFound||[VideoPath rangeOfString:@"https://"].location != NSNotFound) {
// 远程地址
url = [NSURL URLWithString:VideoPath];
}else{
url = [NSURL fileURLWithPath:VideoPath];
}
if (!_playerController) {
_playerController = [[MPMoviePlayerViewController alloc]initWithContentURL:url];
// movePlayer 视频播放器,底层封装了AVPlayer
// 指定资源类型
_playerController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
[self presentViewController:_playerController animated:YES completion:^{
[self stopAudioPlayer]; // 关闭音频播放器
}];
[_playerController.moviePlayer prepareToPlay];
[_playerController.moviePlayer play];
// NSNotificationCenter 通知中心,单例,可以理解为程序中的广播站
// 在通知中心注册self成为某条广播的观察者(具有接收某条广播的能力的一个对象)
// neme 代表广播的名称
// object 可以实现传值
// 作用:一旦有其它对象通过通知中心发送 MPMoviePlayerPlaybackDidFinishNotification 这条广播,self 就能接收到,进而触发Selector方法
// 涉及到对象一对多的场景,效率低于代理,效率最高的是block
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinished) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
// 通过通知中心发广播
// 点击done按钮,播放器会自动通过控制中心发送这条广播
// [[NSNotificationCenter defaultCenter] postNotificationName:MPMoviePlayerPlaybackDidFinishNotification object:nil];
}
- (void)playFinished
{
// 通过通知中心注销self对广播的观察
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
if (_playerController) {
[_playerController.moviePlayer stop];
_playerController = nil;
}
}