播放器 基本控件实现

本文介绍了一个简单的iOS音乐播放器应用程序的实现过程,包括播放器的基本功能如播放、暂停、音量控制等,并实现了播放列表功能及歌曲切换效果。

MainViewController.m

属性等

#import "MainViewController.h"
#import <AVFoundation/AVFoundation.h>
#import "SecondViewController1.h"
#define WIDTH self.view.frame.size.width
#define HEIGHT self.view.frame.size.height
@interface MainViewController ()<SecondViewControllerDelegate>
//添加背景用的ImageView
@property (retain, nonatomic) UIImageView *backView;

//播放进度条
@property (retain, nonatomic) UIProgressView *progress;
@property (retain, nonatomic) UISlider *prog;

//选项卡按钮,赋值播放和暂停
@property (retain, nonatomic) UISegmentedControl * segment;

//选项卡按钮,控制上一曲下一曲
@property (retain, nonatomic) UISegmentedControl *segment1;

//slider,用滑动器来设置音量的大小
@property (retain, nonatomic) UISlider *slider;

//timer,来更新歌曲的当前时间
@property (retain, nonatomic) NSTimer *timer;

//显示时间的lable
@property (retain, nonatomic) UILabel *label;

//加入图片,中间的图片
@property (retain, nonatomic) UIImageView *imageView;

//声明播放器,来播放我们的音频文件
@property (retain, nonatomic) AVAudioPlayer *player;
// 静音开关
@property(nonatomic,retain)UISwitch *swich;

@property(nonatomic,assign)BOOL isOn;

@property(nonatomic,assign)float voiceNum;

@property(nonatomic,retain)NSMutableArray *array;

@property(nonatomic,assign)NSInteger musicNum;

@property(nonatomic,assign)NSInteger num;

//在暂停和播放时回调此按钮
-(void)tapSegment:(UISegmentedControl *)seg;

//更新歌曲时间
-(void)time;

//改变声音大小
-(void) changeVo;

@end

release

@implementation MainViewController
-(void)dealloc
{
    [_array release];
    [_backView release];
    [_progress release];
    [_prog release];
    [_segment release];
    [_slider release];
    [_timer release];
    [_label release];
    [_imageView release];
    [_player release];
    [_swich release];
    [super dealloc];
}

初始化

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [self create];
    }
    return self;
}

- (void)create
{    
    for (int i = 1; i < 10; i++) {
        NSString * str = [NSString stringWithFormat:@"m%d", i];

        NSString *path=[[NSBundle mainBundle] pathForResource:str ofType:@"mp3"];

        [self.array addObject:path];
    }
}

viewDidLoad

self.navigationController.navigationBar.translucent=NO;
    //播放列表
    UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithTitle:@"播放列表" style:UIBarButtonItemStylePlain target:self action:@selector(itemAction:)];
    self.navigationItem.rightBarButtonItem=item;






    self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.array[self.musicNum]] error:nil];

    /*添加背景图片*/
    self.backView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT)];
    self.backView.image = [UIImage imageNamed:@"33.jpg"];
    [self.view insertSubview:self.backView atIndex:0];
    [self.backView release];




    /*实例化进度条,并添加到主视图*/
//    self.progress = [[UIProgressView alloc] initWithFrame:CGRectMake(30, 60, 300, 10)];
//    [self.view addSubview:self.progress];
//    self.progress.progress = 0;

    self.prog=[[UISlider alloc]initWithFrame:CGRectMake(30, 40, 300, 10)];
    [self.view addSubview:self.prog];
    [self.prog release];
    self.prog.minimumValue = 0.0;
    [self.prog addTarget:self action:@selector(progActoin:) forControlEvents:UIControlEventValueChanged ];

    [self.prog setThumbImage:[UIImage imageNamed:@"xin.png"] forState:UIControlStateNormal];




    //添加中间的图片
    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 150, 160, 170)];
    UIImage *image = [UIImage imageNamed:@"44.jpg"];
    self.imageView.image = image;
    [self.view addSubview:self.imageView];
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];
    [self.imageView release];





    //
    //添加segmentControl
    self.segment = [[UISegmentedControl alloc] initWithItems:@[@"Play", @"Pause"]];
    self.segment.frame = CGRectMake(50, 450, 250, 50);
    self.segment.tintColor = [UIColor whiteColor];
    //注册回调方法,在segment的值改变的时候回调注册的方法
    [self.segment addTarget:self action:@selector(tapSegment:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:self.segment];
    [self.segment release];




    // 歌曲控制button

    UIButton *buttonNextMusic = [UIButton buttonWithType:UIButtonTypeSystem];
    buttonNextMusic.frame = CGRectMake(175, 400, 125, 30);
    [buttonNextMusic setTitle:@"下一首" forState:UIControlStateNormal];
    buttonNextMusic.layer.borderWidth = 1;
    [buttonNextMusic addTarget:self action:@selector(buttonNextMusicAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:buttonNextMusic];

    UIButton *buttonLateMusic = [UIButton buttonWithType:UIButtonTypeSystem];
    buttonLateMusic.frame = CGRectMake(50, 400, 125, 30);
    [buttonLateMusic setTitle:@"上一首" forState:UIControlStateNormal];
    buttonLateMusic.layer.borderWidth = 1;
    [buttonLateMusic addTarget:self action:@selector(buttonLateMusicAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:buttonLateMusic];



    // 循环控制button
    UIButton *circulateButton = [UIButton buttonWithType:UIButtonTypeCustom];
    circulateButton.frame=CGRectMake(0, 420, 30, 30);
    [circulateButton setImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];
    [circulateButton addTarget:self action:@selector(changeState:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:circulateButton];



    //设置时间,每一秒钟调用一次绑定的方法  监控
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(time) userInfo:nil repeats:YES];



    //添加声音slider
    self.slider = [[UISlider alloc] initWithFrame:CGRectMake(100,540, 250 , 50)];
    self.slider.thumbTintColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"6.jpg"]];
    [self.slider addTarget:self action:@selector(changeVo) forControlEvents:UIControlEventValueChanged];

    [self.view addSubview:self.slider];
    //设置slider最小值和最大值
    self.slider.minimumValue = 0;
    self.slider.maximumValue = 7;
    [self.slider release];




    //声音开关控件  静音
    self.swich=[[UISwitch alloc]initWithFrame:CGRectMake(10, 550, 60, 30)];
    [self.swich addTarget:self action:@selector(onOrOff:) forControlEvents:UIControlEventValueChanged];
    self.swich.on=YES;
    [self.view addSubview:self.swich];
    [self.swich release];

    self.isOn=YES;


    //把时间显示在lable上
    self.label=[[UILabel alloc]initWithFrame:CGRectMake(130, 70, 100, 20)];
    self.label.layer.borderWidth=1;
    self.label.layer.cornerRadius=7;
    self.label.layer.masksToBounds=YES;
    self.label.textAlignment=NSTextAlignmentCenter;
    [self.view addSubview:self.label];
    [self.label release];

}

实现方法

// 图片旋转
-(void)timeAction
{
    self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, 0.05);


}
// 进度条显示
-(void)progActoin:(UISlider *)prog
{
    self.player.currentTime = prog.value;
}

// 声音开关
-(void)onOrOff:(UISwitch *)s
{
    if (self.isOn) {
        self.slider.value = 0;
        self.player.volume = 0;
    } else {
        self.slider.value = self.voiceNum;
        self.player.volume = self.voiceNum;
    }
    self.isOn = !self.isOn;
}

//改变声音
-(void)changeVo
{
    if (!self.isOn) {
        self.player.volume = 0;
    } else {
    self.player.volume = self.slider.value;
    self.voiceNum = self.player.volume;
    }
}



//更新时间
-(void) time
{

    //获取音频的总时间
    NSTimeInterval totalTime = self.player.duration;
    //获取音频的当前时间
    NSTimeInterval currentTime = self.player.currentTime;
    //根据时间比设置进度条的进度
    self.progress.progress = (currentTime/totalTime);

    //把秒转换成分钟
    NSTimeInterval currentM = currentTime/60;
    currentTime = (int)currentTime%60;

    NSTimeInterval totalM = totalTime/60;
    totalTime = (int)totalTime%60;


    NSString *timeString2 = [NSString stringWithFormat:@"%02.0f:%02.0f|%02.0f:%02.0f",currentM, currentTime, totalM,totalTime];
    self.label.text = timeString2;

   self.prog.value = self.player.currentTime;
    self.prog.maximumValue = self.player.duration;


}


//segment所回调的方法
-(void) tapSegment:(UISegmentedControl *)seg
{

    if (seg.selectedSegmentIndex==0)
    {
        [self.player play];
    }
    else if(seg.selectedSegmentIndex==1)
    {
        [self.player pause];
    }

//    self.prog.maximumValue = self.player.duration;
}

//下一曲button
-(void)buttonNextMusicAction
{

    [self.player release];
     self.musicNum = (self.musicNum + 1) % 9;
    self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.array[self.musicNum]] error:nil];
    self.prog.maximumValue = self.player.duration;
    [self.player play];

}

//上一曲button
-(void)buttonLateMusicAction
{

    [self.player release];
    self.musicNum = (self.musicNum + 8) % 9;
    self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.array[self.musicNum]] error:nil];
    self.prog.maximumValue = self.player.duration;
    [self.player play];


}

-(void)changeState:(UIButton *)button
{
    if (self.isOn) {
        [button setImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];
        self.num=1;

    }
    else{
        [button setImage:[UIImage imageNamed:@"2.png"] forState:UIControlStateNormal];
        self.num=2;
    }
    self.isOn=!self.isOn;
}

// 协议方法 在歌曲菜单中选中的歌曲 能够在此播放

- (void)changeMusic:(NSInteger)number
{
    self.musicNum = number;
    [self.player release];
    self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.array[self.musicNum]] error:nil];
    self.prog.maximumValue = self.player.duration;
    [self.player play];

}

// 跳入歌曲菜单 传值 在菜单中能够使正在播放的歌曲名变色

- (void)itemAction:(UIButton *)button
{
    SecondViewController1 *secondVC = [[SecondViewController1 alloc] init];
    [self.navigationController pushViewController:secondVC animated:YES];
    secondVC.musicNum = self.musicNum;

    secondVC.delegate = self;
}

SecondViewController1.h

#import <UIKit/UIKit.h>
//声明协议
@protocol SecondViewControllerDelegate <NSObject>

-(void)changeMusic:(NSInteger)number;

@end
@interface SecondViewController1 : UIViewController
//代理人属性
@property(nonatomic,assign)id<SecondViewControllerDelegate>delegate;
@property(nonatomic,assign)NSInteger musicNum;


@end

SecondViewController1.m

#import "SecondViewController1.h"

@interface SecondViewController1 ()<UITableViewDelegate,UITableViewDataSource>


@property(nonatomic,retain)NSMutableArray *musicArr;
@property(nonatomic,retain)UITableView *tableView;
@property(nonatomic,retain)NSMutableArray *picArr;

@end

@implementation SecondViewController1

-(void)dealloc
{
    [_picArr release];
    [_musicArr release];
    [_tableView release];
    [super dealloc];
}

-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.musicArr = [NSMutableArray arrayWithObjects:@"手掌心-丁当", @"미쳤어-孙丹菲,Eric", @"幻听-张在仁", @"Botty Music-Deep Side", @"夜", @"Teen Top - 긴 생머리 그녀 (Miss Right)", @"The Downtown Fiction - I Just Wanna Run", @"Teen Top - To You", @"Teen Top - 장난아냐 (Rocking)", nil];

        self.picArr=[NSMutableArray arrayWithObjects:[UIImage imageNamed:@"1.jpg"],[UIImage imageNamed:@"2.jpg"],[UIImage imageNamed:@"3.jpg"],[UIImage imageNamed:@"4.jpg"],[UIImage imageNamed:@"5.jpg"],[UIImage imageNamed:@"6.jpg"],[UIImage imageNamed:@"7.jpg"],[UIImage imageNamed:@"8.jpg"],[UIImage imageNamed:@"9.jpg"], nil];


    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.


    // 导航设置
    self.view.backgroundColor = [UIColor whiteColor];
    self.navigationController.navigationBar.translucent = NO;
    self.title = @"播放列表";

    // tableView 创建
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 375, self.view.frame.size.height - 64) style:UITableViewStyleGrouped];

    self.tableView.backgroundColor = [UIColor colorWithRed:0.5 green:0.2 blue:0.2 alpha:0.3 ];

    [self.view addSubview:self.tableView];

    self.tableView.rowHeight = 100;

    // 签订协议
    self.tableView.delegate = self;
    self.tableView.dataSource = self;

}


// 索引

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    return @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9" ];
}

// 区数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.musicArr.count;
}


// 行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}
// cell创建
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *reuse = @"reuse";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuse];
    if (!cell) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuse] autorelease];

    }

    cell.textLabel.text = self.musicArr[indexPath.section];
    cell.imageView.image=self.picArr[indexPath.section];
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%ld", indexPath.section + 1];


    // 防止在滑动时,未选中的歌曲也变色,对颜色初始化
    cell.textLabel.textColor = [UIColor blackColor];


    // 通过 上一层传过来的 self.musicNum 使当前播放歌曲变色
    if (indexPath.section == self.musicNum) {
        cell.textLabel.textColor = [UIColor redColor];
    }

    return cell;
}

// 返回上一层
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.navigationController popToRootViewControllerAnimated:YES];

    [self.delegate changeMusic:indexPath.section];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值