#import <UIKit/UIKit.h>
#import "AllMusicModel.h"
@interface PlayViewController : UIViewController
@property (nonatomic,strong) AllMusicModel *model;
@end
#import "PlayViewController.h"
#import "PlayView.h"
//要想使用封装好的音频类,导入框,导入类头文件,缺一不可;
#import <AVFoundation/AVFoundation.h>
@interface PlayViewController () <AVAudioPlayerDelegate>
{
//播放器类
AVAudioPlayer *player;
//定时器
NSTimer *timer;
//总体界面
PlayView *play;
//判断有没有歌词
BOOL isIrcOrNot;
//定时器
NSTimer *timer2;
int a;
}
@end
@implementation PlayViewController
- (void)viewDidLoad
{
[super viewDidLoad];
a = 1;
//解决跳转过程一闪一闪的现象,因为MusicPlayViewController默认是透明色
//设置背景色
self.view.backgroundColor = [UIColor grayColor];
self.title = self.model.name;
//将导航条设置为不透明(iOS7以后默认是透明的)
self.navigationController.navigationBar.translucent = NO;
//视图布局
play = [[PlayView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:play];
[play.playBtn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
//左边label表示的当前时间,通过模型传值
play.label1.text = self.model.name;
//右边的label表示音乐总共时间
play.label2.text = self.model.singer;
//获取?mp3路径
NSString *path = [[NSBundle mainBundle] pathForResource:self.model.url ofType:nil];
//这是获取本地路径
NSURL *url = [NSURL fileURLWithPath:path];
//初始化播放器
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
//播放次数,0表示只播放一次,1表示播放2次,往后依次。。。
player.numberOfLoops = 0;
//调整声道,-1、0、1分别为左声道,立体声,右声道
player.pan = 0;
//该属性设置为yes后,才能设置rate属性和prepareToPlay属性
player.enableRate = YES;
//0.5、1、2分别表示播放速度减半,正常,加倍。
player.rate = 1.0f;
//准备播放
[player prepareToPlay];
//设置当前播放时间和音乐总时间
play.currentTime.text = @"00:00";
//player.duration是音乐总共持续的秒数
//转化为音乐一共有多少分钟
int mint = player.duration / 60;
//剩余的秒数
int second = (int)(player.duration) % 60;
NSString *mintStr , *secondStr;
//冒号左边的分钟:转化格式,一位数的话,前面加0,两位数的话,不加
if(mint < 10)
{
mintStr = [NSString stringWithFormat:@"0%d",mint];
}
else
{
mintStr = [NSString stringWithFormat:@"%d",mint];
}
//冒号右边的秒数,同上
if(second < 10)
{
secondStr = [NSString stringWithFormat:@"0%d",second];
}
else
{
secondStr = [NSString stringWithFormat:@"%d",second];
}
//合并冒号两边的分钟和秒数
play.duration.text = [NSString stringWithFormat:@"%@:%@",mintStr,secondStr];
//手动滑动滑条,会出发事件,注意用UIControlEventValueChanged
[play.slider addTarget:self action:@selector(valueChage) forControlEvents:UIControlEventValueChanged];
}
//点击开始按钮,目标动作机制
- (void)click:(UIButton *)startBtn
{
//选中状态和非选中状态做取反处理
//selected为yes显示选中图片,为no显示普通图片
startBtn.selected = !startBtn.selected;
//如果按钮没选中
if(startBtn.selected == NO)
{
//暂停播放音乐
[player pause];
}
//如果选择,播放音乐
else [player play];
//设置一个定时器,有三个参数,没0.1秒都会在本对象中(self)重复(YES)执行sliderMove方法
timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(sliderMove) userInfo:nil repeats:YES];
//定时器开始执行,默认会fire,所以可以不写
//[timer fire];
timer2 = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(sliderStart) userInfo:nil repeats:YES];
}
//定时器每1秒触发的方法
- (void)sliderStart
{
a++;
NSString *mintStr , *secondStr;
int mint = a / 60;
int second = a % 60;
if (second<10)
{
secondStr = [NSString stringWithFormat:@"0%d",second];
NSLog(@"mintStr = %@",mintStr);
}
else
{
secondStr = [NSString stringWithFormat:@"%d",second];
NSLog(@"mintStr = %@",mintStr);
}
if (mint <10)
{
mintStr = [NSString stringWithFormat:@"0%d",mint];
}
else
{
mintStr = [NSString stringWithFormat:@"%d",mint];
}
//设置当前播放时间和音乐总时间
play.currentTime.text = [NSString stringWithFormat:@"%@:%@",mintStr,secondStr];
}
//定时器每0.1秒触发的方法
- (void)sliderMove
{
//滑条的进度没0.1秒会变化,进度值是开始的时候0,结束的是1,当前进度值是,音乐播放的当前时间除以音乐的总共时间
play.slider.value = player.currentTime / player.duration;
}
//手动滑动滑条时触发的方法
- (void)valueChage
{
//音乐播放的当前时间进度=音乐总时间乘以滑条的进度值(0-1)
player.currentTime = player.duration * play.slider.value;
}
//当界面退出时,将定时器停止,播放器关掉,节约内存
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidAppear:animated];
[timer invalidate];
[timer2 invalidate];
[player stop];
}
@end