音乐播放
2015-10-16 04:22 真实16 阅读(277) 评论(0) 编辑 收藏 举报// ViewController.m
// MusicPlayer-葫芦娃专属
//
// Created by Bruce on 15/8/19.
// Copyright (c) 2015年 Bruce. All rights reserved.
//
#import "ViewController.h"
#import "MusicInfoModel.h"
#import "PlayMusic_ViewController.h"
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
{
UITableView *musicListView;
NSArray *musicList;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"葫芦娃的歌单";
musicListView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStyleGrouped];
musicListView.delegate = self;
musicListView.dataSource = self;
[self.view addSubview:musicListView];
}
- (void)viewWillAppear:(BOOL)animated
{
[self loadData];
}
- (void)loadData
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"MusicList" ofType:@"plist"];
NSArray *allList = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *modelList = [NSMutableArray array];
for (NSDictionary *dic in allList) {
MusicInfoModel *model = [[MusicInfoModel alloc]init];
model.musicName = dic[@"musicName"];
model.singerName = dic[@"singerName"];
model.singerHeaderName = dic[@"singerHeaderImage"];
model.desList = dic[@"desImages"];
[modelList addObject:model];
}
musicList = [modelList copy];
[musicListView reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return musicList.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"musicCell"];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"musicCell"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
MusicInfoModel *model = musicList[indexPath.row];
// 歌手头像
cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.jpg",model.singerHeaderName]];
// 歌曲名
cell.textLabel.text = [NSString stringWithFormat:@"歌曲名:《%@》",model.musicName];
// 歌手名
cell.detailTextLabel.text = model.singerName;
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 100;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MusicInfoModel *model = musicList[indexPath.row];
PlayMusic_ViewController *vc = [[PlayMusic_ViewController alloc]init];
vc.info = model;
vc.allMusic = musicList;
vc.select = indexPath.row;
[self.navigationController pushViewController:vc animated:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
//
// PlayMusic_ViewController.m
// MusicPlayer-葫芦娃专属
//
// Created by Bruce on 15/8/19.
// Copyright (c) 2015年 Bruce. All rights reserved.
//
#import "PlayMusic_ViewController.h"
#import "MusicInfoModel.h"
#import <AVFoundation/AVFoundation.h>
@interface PlayMusic_ViewController ()<UIScrollViewDelegate,AVAudioPlayerDelegate>
{
UIPageControl *pageControl;
UILabel *allTimeLabel;
UILabel *curTimeLabel;
UISlider *lineView;
AVAudioPlayer *player;
// 刷新播放时间的定时器
NSTimer *timer;
UIScrollView *myScrollView;
UILabel *name;
NSInteger curIndex;
}
@end
@implementation PlayMusic_ViewController
- (void)viewDidLoad {
[super viewDidLoad];
curIndex = 0;
self.view.backgroundColor = [UIColor whiteColor];
self.title = self.info.musicName;
[self createViews];
}
#pragma mark ---------切换音乐 更新属性
- (void)updateAllMessage:(MusicInfoModel *)info
{
self.title = info.musicName;
myScrollView.contentSize = CGSizeMake(CGRectGetWidth([UIScreen mainScreen].bounds)*info.desList.count, 0);
if (myScrollView.subviews.count!=0) {
for (UIView *view in myScrollView.subviews) {
[view removeFromSuperview];
}
}
for (int i=0; i<info.desList.count; i++) {
NSString *path = [[NSBundle mainBundle] pathForResource:info.desList[i] ofType:nil];
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(CGRectGetWidth([UIScreen mainScreen].bounds)*i, 0, CGRectGetWidth([UIScreen mainScreen].bounds), CGRectGetHeight([UIScreen mainScreen].bounds)/3*2)];
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.image = [UIImage imageWithContentsOfFile:path];
[myScrollView addSubview:imageView];
}
[self playMusicWithName:info.musicName];
name.text = [NSString stringWithFormat:@" %@\n《%@》",info.singerName,info.musicName];
}
//进入页面 播放音乐
- (void)viewWillAppear:(BOOL)animated
{
curIndex = self.select;
[self updateAllMessage:self.info];
}
//退出页面 停止音乐
- (void)viewWillDisappear:(BOOL)animated
{
if (player) {
[timer invalidate];
timer = nil;
[player stop];
player = nil;
}
}
#pragma mark ------音乐播放
- (void)playMusicWithName:(NSString *)names
{
if (player) {
[timer invalidate];
timer = nil;
[player stop];
player = nil;
}
NSString *path = [[NSBundle mainBundle] pathForResource:names ofType:@"mp3"];
player = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];
player.delegate = self;
[player prepareToPlay];
[player play];
lineView.maximumValue = player.duration;
int m = player.duration/60;
int s = [@(player.duration)intValue]%60;
allTimeLabel.text = [NSString stringWithFormat:@"%02d:%02d",m,s];
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateCurTime) userInfo:nil repeats:YES];
}
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (curIndex == self.allMusic.count-1) {
curIndex = 0;
[self updateAllMessage:self.allMusic[curIndex]];
return;
}
if (curIndex<self.allMusic.count) {
curIndex++;
[self updateAllMessage:self.allMusic[curIndex]];
}
}
#pragma mark ------定时器 更新播放时间
- (void)updateCurTime
{
int m = player.currentTime/60;
int s = [@(player.currentTime)intValue]%60;
curTimeLabel.text = [NSString stringWithFormat:@"%02d:%02d",m,s];
// 更新滑杆的进度
lineView.value = player.currentTime;
}
#pragma mark -----创建视图
- (void)createViews
{
myScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth([UIScreen mainScreen].bounds), CGRectGetHeight([UIScreen mainScreen].bounds)/3*2)];
myScrollView.delegate = self;
myScrollView.pagingEnabled = YES;
myScrollView.contentSize = CGSizeMake(CGRectGetWidth([UIScreen mainScreen].bounds)*self.info.desList.count, 0);
[self.view addSubview:myScrollView];
UIView *toolBGView = [[UIView alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(myScrollView.frame), CGRectGetWidth([UIScreen mainScreen].bounds), CGRectGetHeight([UIScreen mainScreen].bounds)/3)];
toolBGView.backgroundColor = [UIColor orangeColor];
[self.view addSubview:toolBGView];
// 分割线
lineView = [[UISlider alloc]initWithFrame:CGRectMake(5, CGRectGetHeight(toolBGView.frame)/2-2, CGRectGetWidth(toolBGView.frame)-10, 2)];
lineView.minimumTrackTintColor = [UIColor lightGrayColor];
lineView.maximumTrackTintColor = [UIColor whiteColor];
lineView.minimumValue = 0.0;
[lineView addTarget:self action:@selector(changeCurTime:) forControlEvents:UIControlEventValueChanged];
[toolBGView addSubview:lineView];
// 艺人名、歌曲名
name = [[UILabel alloc]initWithFrame:CGRectMake(10, 20, CGRectGetWidth(toolBGView.frame)-20, 50)];
name.textColor = [UIColor whiteColor];
name.numberOfLines = 2;
[toolBGView addSubview:name];
pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(name.frame)+5, CGRectGetWidth(toolBGView.frame), 10)];
pageControl.numberOfPages = self.info.desList.count;
pageControl.hidesForSinglePage = YES;
[toolBGView addSubview:pageControl];
// 当前时间的lable
curTimeLabel = [[UILabel alloc]initWithFrame:CGRectMake(5, CGRectGetMaxY(lineView.frame)+10, 100, 20)];
curTimeLabel.font = [UIFont systemFontOfSize:15];
curTimeLabel.text = @"00:00";
curTimeLabel.textColor = [UIColor whiteColor];
[toolBGView addSubview:curTimeLabel];
// 总时长
allTimeLabel = [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetWidth(toolBGView.frame)-5-100, CGRectGetMaxY(lineView.frame)+10, 100, 20)];
allTimeLabel.textAlignment = NSTextAlignmentRight;
allTimeLabel.font = [UIFont systemFontOfSize:15];
allTimeLabel.text = @"00:00";
allTimeLabel.textColor = [UIColor whiteColor];
[toolBGView addSubview:allTimeLabel];
NSArray *titles = @[@"上一曲",@"暂停",@"下一曲"];
for (int i=0; i<3; i++) {
CGFloat w = (CGRectGetWidth(toolBGView.frame)-200)/3;
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100+w*i, CGRectGetMaxY(lineView.frame)+40, w-1, 35);
button.tag = 100+i;
[button setTitle:titles[i] forState:UIControlStateNormal];
if (i==1) {
[button setTitle:@"播放" forState:UIControlStateSelected];
}
button.showsTouchWhenHighlighted = YES;
[button addTarget:self action:@selector(tickButton:) forControlEvents:UIControlEventTouchUpInside];
[toolBGView addSubview:button];
}
}
#pragma mark -------滑杆 滑动 触发
- (void)changeCurTime:(UISlider *)sender
{
player.currentTime = sender.value;
int m = player.currentTime/60;
int s = [@(player.currentTime)intValue]%60;
curTimeLabel.text = [NSString stringWithFormat:@"%02d:%02d",m,s];
}
- (void)tickButton:(UIButton *)sender
{
switch (sender.tag) {
case 100:
if (curIndex>0) {
curIndex--;
[self updateAllMessage:self.allMusic[curIndex]];
}
break;
case 101:
// 播放 暂停
if (player) {
// 进入播放页面 默认音乐是播放状态
// isPlaying 为YES
// 点击按钮的时候 让selected 变成YES
// 根据音乐播放的状态 改变按钮选中的状态
sender.selected = player.isPlaying;
// 如果 音乐正在播放(满足 player.isPlaying !=NO)点击按钮 让音乐暂停
player.isPlaying !=NO ? [player pause]:[player play];
timer.fireDate = player.isPlaying !=YES ? [NSDate distantFuture]:[NSDate distantPast];
}
break;
case 102:
if (curIndex == self.allMusic.count-1) {
curIndex = 0;
[self updateAllMessage:self.allMusic[curIndex]];
return;
}
if (curIndex<self.allMusic.count) {
curIndex++;
[self updateAllMessage:self.allMusic[curIndex]];
}
break;
default:
break;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
int curPage = scrollView.contentOffset.x/CGRectGetWidth([UIScreen mainScreen].bounds);
pageControl.currentPage = curPage;
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
//
// MusicInfoModel.h
// MusicPlayer-葫芦娃专属
//
// Created by Bruce on 15/8/19.
// Copyright (c) 2015年 Bruce. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MusicInfoModel : NSObject
@property (nonatomic,copy) NSString *musicName;
@property (nonatomic,copy) NSString *singerName;
@property (nonatomic,copy) NSString *singerHeaderName;
@property (nonatomic,copy) NSArray *desList;
@end