//这个方法可以实现照相和取图片功能
照相
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
//支持照相功能
[self loadImageWithType:UIImagePickerControllerSourceTypeCamera];
}else {
NSLog(@"抱歉,暂时不能照相");
[self showMessage:@"不支持照相功能"];
}
查看图片
[self loadImageWithType:UIImagePickerControllerSourceTypePhotoLibrary];
- (void)loadImageWithType:(UIImagePickerControllerSourceType)type {
//创建UIImagePickerController对象
UIImagePickerController *imagePC = [[UIImagePickerController alloc] init];
//设置资源类型
imagePC.sourceType = type;
//设置是否支持后续操作 YES 支持 NO 不支持
imagePC.allowsEditing = YES;
//设置代理
imagePC.delegate = self;
//一般都采用模态视图跳转方式
[self presentViewController:imagePC animated:YES completion:^{
NSLog(@"跳转完成");
}];
}
//点击choose完成按钮实现的方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
//info:里面包含所有信息
NSLog(@"%@",info);
//选取资源类型 这列是Medie类型
NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
NSLog(@"type:%@",type);
//判断当前图片是否是普通图片 (公共图片) public.image
if ([type isEqualToString:@"public.image"]) {
//如果后续操作是NO 就没有这个key:UIImagePickerControllerEditedImage
//不管有没有后续操作 都可以取UIImagePickerControllerOriginalImage
//选取图片 根据类型EditedImage 这个key得到图片image
UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
_tableView.backgroundColor = [UIColor colorWithPatternImage:image];
}
//跳回去 必须要加 否则用户无法回到应用
[picker dismissViewControllerAnimated:YES completion:^{
NSLog(@"返回完成");
}];
}
//点击cancel取消按钮执行这个方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
NSLog(@"取消");
[picker dismissViewControllerAnimated:YES completion:^{
NSLog(@"返回完成");
[self showMessage:@"照相取消"];
}];
}
- (void)showMessage:(NSString *)message {
UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:message delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
[alerView show];
}
//加载视频的方法 根据路径
- (void)loadMovieWithPath:(NSString *)path {
NSURL *url = nil;
//判断是否是本地视频还是网络视频,如果路径前缀是http://或者https://开头 ,说明网络视频 否则是本地视频
if ([path hasPrefix:@"http://"] || [path hasPrefix:@"https://"]) {
//网络视频
url = [NSURL URLWithString:path];
}else {
//本地视频
url = [NSURL fileURLWithPath:path];
}
//根据url对象得到(创建)视频控制器对象
_moviePlayerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
//播放play 视图控制器对象没有播放方法 是里面(属性)的moviePlayer 去播放
[_moviePlayerVC.moviePlayer play];
//设置普通类型视频 (资源类型)
_moviePlayerVC.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
//push跳转
[self.navigationController pushViewController:_moviePlayerVC animated:YES];
}
//添加通知监听的方法
//添加通知监听视频的状态变化,视频播放需要使用通知来实现其状态变化,而不是通过协议代理的形式
- (void)addNoties {
//视频播放状态改变的通知 MPMoviePlayerPlaybackStateDidChangeNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerBackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:_player];
//视频播放完成后的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:_player];
}
//视频状态改变
- (void)playerBackStateChange:(NSNotification *)noti {
//noti的object属性 得到视频控制对象
MPMoviePlayerController *currentPlayer = noti.object;
switch (currentPlayer.playbackState) {
case MPMoviePlaybackStatePlaying:
{
NSLog(@"播放中");
}
break;
case MPMoviePlaybackStatePaused:
{
NSLog(@"暂停");
}
break;
case MPMoviePlaybackStateInterrupted:
{
NSLog(@"中断");
}
break;
case MPMoviePlaybackStateSeekingForward:
{
NSLog(@"快进");
}
break;
case MPMoviePlaybackStateSeekingBackward:
{
NSLog(@"后退");
}
break;
case MPMoviePlaybackStateStopped:
{
NSLog(@"停止");
}
break;
default:
break;
}
}
自定义播放视频
//创建并播放的方法
- (void)createAndPlay {
//在实际开发中,每次播放一个视频,先使播放器对象为空,以保证每次进入这个方法后,开始新的视频(新的内存)播放
_player = nil;
//获取视频文件路径
NSString *strPath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp4"];
//得到url对象
NSURL *url = [NSURL fileURLWithPath:strPath];
//初始化视频播放器对象
_player = [[MPMoviePlayerController alloc] initWithContentURL:url];
//设置播放器的播放视图位置以及大小
_player.view.frame = CGRectMake(0, 200, self.view.frame.size.width, 300);
//将播放视图添加到父视图self.view上
[self.view addSubview:_player.view];
/*
MPMovieControlStyleNone,
MPMovieControlStyleEmbedded,
MPMovieControlStyleFullscreen,
MPMovieControlStyleDefault
*/
//在实际开发中,需要定制自己的播放按钮、快进 慢退等等,则必须先隐藏系统自带的空间 需要设置controlStyle属性 类型None
_player.controlStyle = MPMovieControlStyleFullscreen;
//播放
[_player play];
}
播放音乐
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//当视图将要消失的时候 停止播放
[self stopMusic];
}
//配置支持后台播放的方法
- (void)configBackPlay {
//[AVAudioSession sharedInstance] 创建单例对象audioSession会话对象
//设置音频会话种类 AVAudioSessionCategoryPlayback 音频播放种类 设置此类告诉系统禁止其他音频播放器
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
//激活音频会话对象
[[AVAudioSession sharedInstance] setActive:YES error:nil];
//注意:在此处配置只是后台播放配置步骤之一,千忘别忘了需要在info.plist文件增加其属性置顶
}
//初始化UI
- (void)initUI {
//将持续时间设置到mySlider的maximumValue的属性上
self.mySlider.maximumValue = _audioPlayer.duration;
//currentTime:当前进度(当前时间)
self.mySlider.value = _audioPlayer.currentTime;
//value值方法改变的时候响应sliderMethod:这个方法
[self.mySlider addTarget:self action:@selector(sliderMethod:) forControlEvents:UIControlEventValueChanged];
//当在insider(里面)抬起的时候调用stopTouchSlider:这个方法
[self.mySlider addTarget:self action:@selector(stopTouchSlider:) forControlEvents:UIControlEventTouchUpInside];
}
//按住滑块的时候执行
- (void)sliderMethod:(UISlider *)slider {
//定时器停止 设置一个未来时间就停止定时器
[_timer setFireDate:[NSDate distantFuture]];
//暂停音乐
[_audioPlayer pause];
//修改按钮的标题-播放 (可选)
[self.myButton setTitle:@"播放" forState:UIControlStateNormal];
//音乐的进度随着slider的值改变
_audioPlayer.currentTime = (double)slider.value;
}
//抬起的时候执行
- (void)stopTouchSlider:(UISlider *)slider {
//开启定时器 设置当前时间就启动定时器
[_timer setFireDate:[NSDate date]];
//播放
[_audioPlayer play];
//修改按钮的标题-暂停
[self.myButton setTitle:@"暂停" forState:UIControlStateNormal];
}
//初始化定时器
- (void)initTimer {
_timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(valueChanged:) userInfo:_mySlider repeats:YES];
}
- (void)valueChanged:(NSTimer *)timer {
//0.2秒就会改变self.mySlider的进度值
self.mySlider.value = _audioPlayer.currentTime;
}
//播放当前音乐 参数判断是否是第一次进来 如果是 不让它播放
- (void)playCurrentMusic:(BOOL)isFirst {
//初始化音乐播放器对象 第一个参数url对象 直接从可变数中取
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:arrPlayDataSource[currentPlayIndex] error:nil];
//准备播放
[_audioPlayer prepareToPlay];
if (isFirst) {
NSLog(@"是第一次进来");
}else {
//播放
[_audioPlayer play];
[self.myButton setTitle:@"暂停" forState:UIControlStateNormal];
}
//设置播放次数
//-1 设置任何负数都表示无限循环播放 直到手动停止播放 0:代表播放1次 1:播放2次
_audioPlayer.numberOfLoops = -1;
//设置代理
_audioPlayer.delegate = self;
}
//初始化列表数据源
- (void)initPlayList {
//这个是查询项目中所有mp3个格式的音频文件,返回放入到数组中,第二个参数是子目录默认为空
NSArray *arrTemp = [[NSBundle mainBundle] URLsForResourcesWithExtension:@"mp3" subdirectory:nil];
NSLog(@"%@",arrTemp);
//将获取的url路径 填入数据源(可变数据),就是不可数组放入到可变数组中
arrPlayDataSource = [[NSMutableArray alloc] initWithArray:arrTemp];
currentPlayIndex = 0; //初始化设置第一条开始播放 (0下标)
}
- (IBAction)click:(id)sender {
UIButton *myButton = sender;
NSLog(@"tag:%ld",myButton.tag);
switch (myButton.tag) {
case 100:
{
//上一首
[self previousMusic];
}
break;
case 200:
{
//判断播放器对象是否为空 需要重新申请内存空间 然后播放
if (_audioPlayer == nil) {
//播放音乐
[self playCurrentMusic:NO];
//跳槽swich
break;
}
//判断播放器对象是否在播放 isPlaying如果真 说明正在播放 否则不播放
if (_audioPlayer.isPlaying) {
//暂停音乐
[_audioPlayer pause];
[myButton setTitle:@"播放" forState:UIControlStateNormal];
//停止定时器
[_timer setFireDate:[NSDate distantFuture]];
NSLog(@"未来的时间:%@",[NSDate distantFuture]);
}else {
//播放音乐
[_audioPlayer play];
[myButton setTitle:@"暂停" forState:UIControlStateNormal];
//启动定时器
[_timer setFireDate:[NSDate date]];
NSLog(@"当前时间:%@",[NSDate date]);
}
}
break;
case 300:
{
//下一首
[self nextMusic];
}
break;
case 400:
{
//停止
[self stopMusic];
}
break;
default:
break;
}
}
//下一首
- (void)nextMusic {
//先停止当前音乐播放
[self stopMusic];
//改索引
currentPlayIndex++;
//必须要判断 为了防止超出数组的范围,超出就会崩溃
if (currentPlayIndex >= arrPlayDataSource.count) {
currentPlayIndex = 0; //如果超过了数组范围,让索引值为0 就是从头开始
}
//播放当前音乐
[self playCurrentMusic:NO];
}
//上一首
- (void)previousMusic {
//先停止当前音乐播放
[self stopMusic];
//改变索引
currentPlayIndex--;
//必须要加判断 如果不加判断会导致索引值为负数,会导致崩溃
if (currentPlayIndex < 0) {
//如果是负数 让索引到数组中最后一首歌曲
currentPlayIndex = (int)arrPlayDataSource.count - 1;
}
//播放当前音乐
[self playCurrentMusic:NO];
}
//停止音乐的方法
- (void)stopMusic {
//停止音频播放 调用stop方法
[_audioPlayer stop];
//将播放器对象设置为空,防止每次调用上面playerCurrentMusci这个方法每次都alloc 会不断申请内存,这个设置nil 释放一下内存空间
_audioPlayer = nil;
[self.myButton setTitle:@"播放" forState:UIControlStateNormal];
}