ios 音乐播放器进度条_ios 播放进度条 带缓存进度条 - CSDN
  • 利用定时器,UISlider以及它的...2.拖动进度条时,播放器自动播放到对应的点 代码实现 这个是slider的基本设置 @property (nonatomic, retain) UISlider *slider; // 进度条 self.slider = [[UISlider alloc] initW...

    利用定时器,UISlider以及它的响应事件简单实现进度条

    效果图

    在这里插入图片描述

    实现的功能有:

    1.进度条随着时间的变化自动改变位置
    2.拖动进度条时,播放器自动播放到对应的点

    代码实现

    这个是slider的基本设置

    @property (nonatomic, retain) UISlider *slider;
    // 进度条
        self.slider = [[UISlider alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth - 100, 20)];
        self.slider.center = CGPointMake(kControlBarCenterX, kControlBarCenterY + 10);
        self.slider.minimumTrackTintColor = [UIColor blueColor];
        self.slider.minimumValue = 0.0;
        self.slider.maximumValue = 1.0;
        //将滑动条加入到控制器上
        [self.view addSubview:self.slider];
    

    先介绍拖动滑块时播放器跟着播放到对应的点的方法

      //1.监听slider变化状态;(value值变化)(最主要的作用是:监听滑块的拖动)(与滑块自动滑不相关,因为value的值已经在定时器作用下会自动改变值)
        //1.1(UIControlEventValueChanged)这个事件的响应比价特殊,其实跟点击按钮效果一样,点击了就会响应,而这里是拖动进度条才会有响应
        [self.slider addTarget:self action:@selector(progressAction:) forControlEvents:UIControlEventValueChanged];
    
    progressAction:方法的实现
    #pragma mark - 手动拖动进度条的相应地变化
    -(void)progressAction:(UISlider *)slider{
            //1.slider的value值发生变化时,currentTime也在发生变化(在playerAction中定义了value的公式)
            float current = slider.value;
            //2.获取最终的currentTime
            float nextCurrent = current * CMTimeGetSeconds(self.player.currentItem.duration);
            //3.拖动slider导致value的值改变时,player能够让正在进行的item追着时间走
            [self.player seekToTime:CMTimeMakeWithSeconds(nextCurrent, 1.0)];
            //6.使得计时器一直处于启动状态
            self.timer.fireDate =[NSDate distantPast];
    }
    

    这样就可以实现拖动滑块时播放器跟着播放到对应的点上

    接着介绍一下滑块随着时间自动改变位置的方法

    这里应用到的是定时器的方法

    @property (nonatomic, retain) NSTimer *timer;
    // 计时器 控制播放(slider的跟随时间的滑动)
        //使用定时器方法:每间隔一秒响应playerAction方法(因为进度条时间是按每秒变化的)
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(playerAction) userInfo:nil repeats:YES];
    playerAction方法的实现
    #pragma mark - 播放计时器方法
    -(void)playerAction{
        //当前时间 / 总时间 赋值给slider.value.value改变,滑块会跟着滑动,self.player.currentItem.currentTime,self.player.currentItem.duration表示获取当前音频的播放时间和总时间,这时AVPlayer自带的
        self.slider.value = CMTimeGetSeconds(self.player.currentItem.currentTime) / CMTimeGetSeconds(self.player.currentItem.duration);
    }
    

    通过这样设置,滑块就会跟着时间自动改变到相应的位置

    展开全文
  • [IOS]对视频、音频播放器添加缓冲进度条 Demo地址:http://download.csdn.net/detail/u012881779/8854967 思路说起来很简单: 先拖一个Progress View控件,设置它的Progress Tint和Track Tint; 再拖一个...

    [IOS]对视频、音频播放器添加缓冲进度条


    Demo地址:http://download.csdn.net/detail/u012881779/8854967

    思路说起来很简单:

    先拖一个Progress View控件,设置它的Progress Tint和Track Tint;

    再拖一个Horizontal Slider覆盖在ProgressView上面,设置它的Min Track Tint 同时设置Max Track Tint为Clear Color(为了透过控件看见背后progressView的背景);

    最后分别设置一下各进度的值就OK了。

    Min Track Tint(播放进度)、Progress Tint(缓冲进度)、Track Tint(进度条背景)。

    @interface AVVideoViewController: UIViewController
    @property (weak, nonatomic) IBOutlet UISlider       *mScrubber;     //播放进度
    @property (weak, nonatomic) IBOutlet UIProgressView *cacheProgressV;//缓冲进度
    @end
    
    @implementation AVVideoViewController
    
    - (void)syncScrubber
    {
        /*播放进度*/
    	CMTime playerDuration = [self playerItemDuration];
    	if (CMTIME_IS_INVALID(playerDuration)) 
    	{
    		mScrubber.minimumValue = 0.0;
            [self showStarLabletimeToEndLableTime:0.0 end:0.0];
    		return;
    	} 
        
    	double duration = CMTimeGetSeconds(playerDuration);
    	if (isfinite(duration))
    	{
    		float minValue = [self.mScrubber minimumValue];
    		float maxValue = [self.mScrubber maximumValue];
    		double time = CMTimeGetSeconds([self.mPlayer currentTime]);
    		[self showStarLabletimeToEndLableTime:time end:duration];
    		[self.mScrubber setValue:(maxValue - minValue) * time / duration + minValue];
    	}
    
        /*缓冲进度*/
        NSTimeInterval timeInterval = [self availableDuration];
        NSLog(@"Time I nterval:%f",timeInterval);
        CMTime duration11 = self.mPlayerItem.duration;
        CGFloat totalDuration = CMTimeGetSeconds(duration11);
        [_cacheProgressV setProgress:timeInterval / totalDuration animated:YES];
    }
    
    // 计算缓冲进度
    - (NSTimeInterval)availableDuration {
        NSArray *loadedTimeRanges = [[self.mPlayer currentItem] loadedTimeRanges];
        CMTimeRange timeRange = [loadedTimeRanges.firstObject CMTimeRangeValue];// 获取缓冲区域
        float startSeconds = CMTimeGetSeconds(timeRange.start);
        float durationSeconds = CMTimeGetSeconds(timeRange.duration);
        
        NSTimeInterval result = startSeconds + durationSeconds;// 计算缓冲总进度
        
        return result;
    }
    
    @end
     


    示意图:




    展开全文
  • 前段时间做项目遇到播放器自定义进度条的需求,刚开始想的是继承自系统的UISlider去做,内部重写系统方法完成样式定制。后来遇到头疼的问题,在iphone6、7手机上样式显示正常,遇到plus手机进度条样式显示有问题,...

    前段时间做项目遇到播放器自定义进度条的需求,刚开始想的是继承自系统的UISlider去做,内部重写系统方法完成样式定制。后来遇到头疼的问题,在iphone6、7手机上样式显示正常,遇到plus手机进度条样式显示有问题,缓存进度跟最底部的进度高度不匹配,有偏移,调了很多次,都以徒劳告终,后来没办法,自己自定义了一套进度条的实现方案,配合iOS自有手势操作,完成基本功能操作。下面介绍下自定义实现类:

    这块功能主要涉及到两个类文件,ZTCSlider,ZTCProgressView:

    一、ZTCSlider类,负责进度条交互操作、进度条变化

     ZTCSlider.h,介绍初始化方法,及相关操作回调,返回进度值;播放进度、缓存进度可通过外部调用setter方法传入

    #import <UIKit/UIKit.h>
    
    /**
     获取滑动进度回调
    
     @param value 滑动进度
     */
    typedef void (^MGBroadcastGetSlideValueHandler)(CGFloat value);
    
    /**
     开始拖动进度块回调
     */
    typedef void (^MGBroadcastSliderPanBeginHandler)(void);
    
    /**
     结束拖动进度块回调
    
     @param value 进度值
     */
    typedef void (^MGBroadcastSliderPanEndHandler)(CGFloat value);
    
    
    /**
     点击进度条某一部分
    
     @param value 进度值
     */
    typedef void (^MGBroadcastSliderTapSliderHandler)(CGFloat value);
    
    @interface ZTCSlider : UIView
    
    /**
     滑条初始化方法
    
     @param sliderWidth 滑块宽度
     @param sliderColor 滑块颜色
     @param progressHeight 进度条高度
     @param progressBgColor 进度套背景色
     @param progressPlayedColor 进度条播放后的颜色
     @param progressCachedColor 进度条缓存的颜色
     @param isShowCorner 是否设置进度条圆角效果
     */
    - (instancetype)initWithSliderWidth:(CGFloat)sliderWidth
                            sliderColor:(UIColor *)sliderColor
                         progressHeight:(CGFloat)progressHeight
                        progressBgColor:(UIColor *)progressBgColor
                    progressPlayedColor:(UIColor *)progressPlayedColor
                     progressCachedColor:(UIColor *)progressCachedColor
                             showCorner:(BOOL)isShowCorner;
    
    ///播放值
    @property (nonatomic, assign) CGFloat slideValue;
    
    ///缓存值
    @property (nonatomic, assign) CGFloat cacheValue;
    
    /**
     开始拖动的操作
     */
    @property (nonatomic, copy) MGBroadcastSliderPanBeginHandler panBeginHandler;
    
    /**
     结束拖动的操作
     */
    @property (nonatomic, copy) MGBroadcastSliderPanEndHandler panEndHandler;
    
    /**
     获取进度值
     */
    @property (nonatomic, copy) MGBroadcastGetSlideValueHandler getSlideValueHandler;
    
    /**
     点击进度条某个部分的操作
     */
    @property (nonatomic, copy) MGBroadcastSliderTapSliderHandler tapSliderHandler;
    
    @end
    

    ZTCSlider.m

    #import "ZTCSlider.h"
    #import "ZTCProgressView.h"
    
    @interface ZTCSlider()
    
    ///滑块
    @property (nonatomic, strong) UIView *sliderView;
    
    ///h进度条
    @property (nonatomic, strong) ZTCProgressView *progressView;
    
    @property (nonatomic, strong) UIPanGestureRecognizer *panGesture;
    
    @property (nonatomic, strong) UITapGestureRecognizer *tapGesture;
    
    @property (nonatomic, assign) CGFloat sliderWidth;
    
    @property (nonatomic, strong) UIColor *sliderColor;
    
    @property (nonatomic, assign) CGFloat progressHeight;
    
    @property (nonatomic, strong) UIColor *progressBgColor;
    
    @property (nonatomic, strong) UIColor *progressPlayedColor;
    
    @property (nonatomic, strong) UIColor *progressCachedColor;
    
    @property (nonatomic, assign) BOOL isShowCorner;
    
    @end
    
    @implementation ZTCSlider
    
    - (instancetype)initWithSliderWidth:(CGFloat)sliderWidth
                            sliderColor:(UIColor *)sliderColor
                         progressHeight:(CGFloat)progressHeight
                        progressBgColor:(UIColor *)progressBgColor
                    progressPlayedColor:(UIColor *)progressPlayedColor
                    progressCachedColor:(UIColor *)progressCachedColor
                           showCorner:(BOOL)isShowCorner {
        self = [super init];
        if (self) {
            _sliderWidth = sliderWidth;
            _sliderColor = sliderColor;
            _progressHeight = progressHeight;
            _progressBgColor = progressBgColor;
            _progressPlayedColor = progressPlayedColor;
            _progressCachedColor = progressCachedColor;
            _isShowCorner = isShowCorner;
            [self setUpUI];
        }
        return self;
    }
    
    - (void)setUpUI {
        [self addSubview:self.progressView];
        [self addSubview:self.sliderView];
        self.userInteractionEnabled = YES;
        [self addGestureRecognizer:self.panGesture];
        [self addGestureRecognizer:self.tapGesture];
    }
    
    - (void)setSlideValue:(CGFloat)slideValue {
        if (_slideValue != slideValue) {
            _slideValue = slideValue;
            CGRect frame = self.sliderView.frame;
            frame.origin.x = _slideValue *(CGRectGetWidth(self.bounds) - CGRectGetWidth(self.sliderView.bounds));
            self.progressView.playValue = _slideValue;
        }
    }
    
    - (void)setCacheValue:(CGFloat)cacheValue {
        if (_cacheValue != cacheValue) {
            _cacheValue = cacheValue;
            self.progressView.cacheValue = cacheValue;
        }
    }
    
    - (void)tapGesture:(UITapGestureRecognizer *)tap {
        CGPoint point = [tap locationInView:tap.view];
        
        if (point.x <= _sliderWidth / 2) {
            point.x = _sliderWidth / 2;
        }
        
        if (point.x > CGRectGetWidth(self.bounds) - _sliderWidth / 2) {
            point.x = CGRectGetWidth(self.bounds) - _sliderWidth / 2;
        }
        
        CGPoint center = self.sliderView.center;
        center.x = point.x;
        self.sliderView.center = center;
        
        CGRect frame = self.sliderView.frame;
        
        CGFloat value =  frame.origin.x / (CGRectGetWidth(self.bounds) - CGRectGetWidth(self.sliderView.bounds));
        
        self.progressView.playValue = value;
        if (self.tapSliderHandler) {
            self.tapSliderHandler(value);
        }
    }
    
    - (void)panGesture:(UIPanGestureRecognizer *)pan {
        //移动的距离
        CGPoint point = [pan translationInView:pan.view];
        CGRect frame = self.sliderView.frame;
        frame.origin.x += point.x;
        
        if (frame.origin.x + CGRectGetWidth(frame) >= CGRectGetWidth(self.bounds)) {
            frame.origin.x = CGRectGetWidth(self.bounds) - CGRectGetWidth(frame);
        }
        
        if (frame.origin.x <= 0) {
            frame.origin.x = 0;
        }
        self.sliderView.frame = frame;
    
        if (pan.state == UIGestureRecognizerStateBegan) {
            if (self.panBeginHandler) {
                self.panBeginHandler();
            }
        }
        
        CGFloat value =  frame.origin.x / (CGRectGetWidth(self.bounds) - CGRectGetWidth(frame));
        
        self.progressView.playValue = value;
        if (self.getSlideValueHandler) {
            self.getSlideValueHandler(value);
        }
        
        if (pan.state == UIGestureRecognizerStateEnded) {
            if (self.panEndHandler) {
                self.panEndHandler(value);
            }
        }
        [pan setTranslation:CGPointZero inView:pan.view];
    }
    
    -(void)layoutSubviews {
        [super layoutSubviews];
        _progressView.frame = CGRectMake(0, (CGRectGetHeight(self.frame) - _progressHeight) * 0.5, CGRectGetWidth(self.frame), _progressHeight);
        _progressView.layer.cornerRadius = _isShowCorner ? _progressHeight * 0.5 : 0;
        _sliderView.frame = CGRectMake(0, (CGRectGetHeight(self.frame) - _sliderWidth) / 2, _sliderWidth, _sliderWidth);
    }
    
    - (ZTCProgressView *)progressView {
        if (!_progressView) {
            _progressView = [[ZTCProgressView alloc] initWithProgressBgColor:_progressBgColor
                                                                 progressPlayedColor:_progressPlayedColor
                                                                 progressCachedColor:_progressCachedColor];
            _progressView.clipsToBounds = YES;
        }
        return _progressView;
    }
    
    - (UIPanGestureRecognizer *)panGesture {
        if (!_panGesture) {
            _panGesture =[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
        }
        return _panGesture;
    }
    
    - (UITapGestureRecognizer *)tapGesture {
        if (!_tapGesture) {
            _tapGesture =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
            _tapGesture.numberOfTapsRequired = 1;
        }
        return _tapGesture;
    }
    
    - (UIView *)sliderView {
        if (!_sliderView) {
            _sliderView =[[UIView alloc] init];
            _sliderView.backgroundColor = _sliderColor ?: [UIColor whiteColor];
            _sliderView.layer.cornerRadius = _sliderWidth * 0.5;
            _sliderView.clipsToBounds = YES;
            _sliderView.layer.shadowOpacity = 0.8;
            _sliderView.layer.shadowOffset = CGSizeMake(0, 2);
            _sliderView.layer.shadowColor = [UIColor blackColor].CGColor;
        }
        return _sliderView;
    }
    
    @end

    二、ZTCProgressView,负责进度条的显示样式

    ZTCProgressView.h

    #import <UIKit/UIKit.h>
    
    @interface ZTCProgressView : UIView
    
    /**
     设置进度条样式
    
     @param progressBgColor 进度条背景色,最底部
     @param progressPlayedColor 进度条已经播放的颜色
     @param progressCachedColor 视频已缓存部分的颜色
     */
    - (instancetype)initWithProgressBgColor:(UIColor *)progressBgColor
                        progressPlayedColor:(UIColor *)progressPlayedColor
                        progressCachedColor:(UIColor *)progressCachedColor;
    
    
    ///播放进度
    @property (nonatomic, assign) CGFloat playValue;
    
    ///加载进度
    @property (nonatomic, assign) CGFloat cacheValue;
    
    @end

    ZTCProgressView.m

    #import "ZTCProgressView.h"
    
    @interface ZTCProgressView()
    
    @property (nonatomic, strong) UIView *cacheView;
    
    @property (nonatomic, strong) UIView *playProgressView;
    
    @property (nonatomic, strong) UIColor *progressBgColor;
    
    @property (nonatomic, strong) UIColor *progressPlayedColor;
    
    @property (nonatomic, strong) UIColor *progressCachedColor;
    
    @end
    
    @implementation ZTCProgressView
    
    - (instancetype)initWithProgressBgColor:(UIColor *)progressBgColor
                        progressPlayedColor:(UIColor *)progressPlayedColor
                        progressCachedColor:(UIColor *)progressCachedColor {
        self = [super init];
        if (self) {
            _progressBgColor = progressBgColor;
            _progressPlayedColor = progressPlayedColor;
            _progressCachedColor = progressCachedColor;
            [self setUpUI];
        }
        return self;
    }
    
    - (void)setUpUI {
        self.backgroundColor = _progressBgColor;
        [self addSubview:self.cacheView];
        [self addSubview:self.playProgressView];
    }
    
    - (void)setPlayValue:(CGFloat)playValue {
        _playValue = playValue;
        CGRect frame = self.playProgressView.frame;
        frame.size.width = playValue * CGRectGetWidth(self.bounds);
        self.playProgressView.frame = frame;
    }
    
    - (void)setCacheValue:(CGFloat)cacheValue {
        _cacheValue = cacheValue;
        CGRect frame = self.cacheView.frame;
        frame.size.width = cacheValue * CGRectGetWidth(self.bounds);;
        self.cacheView.frame = frame;
    }
    
    - (void)layoutSubviews {
        [super layoutSubviews];
        self.playProgressView.frame = CGRectMake(0, 0, _playValue * CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds));
        self.cacheView.frame = CGRectMake(0, 0, _cacheValue * CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds));
    }
    
    - (UIView *)cacheView {
        if (!_cacheView) {
            _cacheView = [[UIView alloc] init];
            _cacheView.backgroundColor = _progressCachedColor;
        }
        return _cacheView;
    }
    
    - (UIView *)playProgressView {
        if (!_playProgressView) {
            _playProgressView =[[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, self.bounds.size.height)];
            _playProgressView.backgroundColor = _progressPlayedColor;
        }
        return _playProgressView;
    }
    
    @end
    

    三、ZTCSlider实现调用:

    ZTCSlider *slider = [[ZTCSlider alloc] initWithSliderWidth:25 sliderColor:[UIColor whiteColor] progressHeight:5 progressBgColor:[UIColor darkGrayColor] progressPlayedColor:[UIColor blueColor] progressCachedColor:[UIColor lightGrayColor] showCorner:YES];
        
        [slider setPanBeginHandler:^{
            NSLog(@"开始拖动");
        }];
        
        [slider setTapSliderHandler:^(CGFloat value) {
            NSLog(@"点击位置:%f", value);
        }];
        
        [slider setGetSlideValueHandler:^(CGFloat value) {
            NSLog(@"获取进度:%f", value);
        }];
        
        [slider setPanEndHandler:^(CGFloat value) {
            NSLog(@"拖动结束位置:%f", value);
        }];
        
        slider.frame = CGRectMake(50, 200, 275, 35);
        slider.backgroundColor = [UIColor orangeColor];
        [self.view addSubview:slider];
    

    注:实际开发中,进度条大多会跟播放器同步使用,ZTCSlider类中的进度条操作回调传值可用来控制播放器的进度。

    显示效果:

    说明:这里的橙色是创建的slider的实际大小,所以对于系统的UISlider手势操作范围小的问题,也完美的解决了;蓝色是已经播放的进度,深灰色是背景颜色,缓存进度由于我这里没有嵌入播放器,没有展示出来。可根据需要嵌入播放器中来加载显示缓存进度。

    展开全文
  • ios- 音乐播放器(1)

    2015-09-09 11:30:10
    音乐播放器 这里做一个简单的音乐播放器,数据是加载的本地的 实现了简单的点击播放的功能  使用了#import 框架 之后会持续的完善更新音乐播放器 核心代码: -(void)tableView:(UITableView *)tableView ...

    音乐播放器

    这里做一个简单的音乐播放器,数据是加载的本地的 实现了简单的点击播放的功能 

    使用了#import <AVFoundation/AVFoundation.h> 框架  之后会持续的完善更新音乐播放器

    核心代码:

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //播放音乐
        
        QHMusic *music = self.musicArray[indexPath.row];
        
        //创建播放器
        
        NSURL *url = [[NSBundle mainBundle]URLForResource:music.filename withExtension:nil];
        
        //注意这里必须使用全局变量
        AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
        
        //缓冲(以便后面播放比较流畅)
        
        [audioPlayer prepareToPlay];
        
        //开始播放
        [audioPlayer play];
        
        self.audioPlayer = audioPlayer;
        
        
    }

    主要代码

    数据模型

    #import <Foundation/Foundation.h>
    
    @interface QHMusic : NSObject
    
    @property(nonatomic,copy)NSString *name;
    
    @property(nonatomic,copy)NSString *filename;
    
    @property(nonatomic,copy)NSString *singer;
    
    @property(nonatomic,copy)NSString *singerIcon;
    
    @property(nonatomic,copy)NSString *icon;
    
    +(id)musicWithDict:(NSDictionary *)dict;
    
    -(id)initWithDict:(NSDictionary *)dict;
    
    
    @end
    
    #import "QHMusicViewController.h"
    #import "QHMusic.h"
    #import <AVFoundation/AVFoundation.h>
    
    
    @interface QHMusicViewController ()
    
    @property(nonatomic,strong)NSArray *musicArray;
    @property (strong, nonatomic) IBOutlet UITableView *tableView;
    @property(nonatomic,strong)AVAudioPlayer *audioPlayer;
    @end
    
    @implementation QHMusicViewController
    
    -(NSArray *)musicArray
    {
        if (!_musicArray) {
            NSString *path = [[NSBundle mainBundle]pathForResource:@"Musics.plist" ofType:nil];
            NSArray *array = [NSArray arrayWithContentsOfFile:path];
            
            NSMutableArray *objs = [NSMutableArray array];
            
            for(NSDictionary * dict in array)
            {
                QHMusic *music = [QHMusic musicWithDict:dict];
                [objs addObject:music];
            }
            _musicArray = objs;
        }
        return _musicArray;
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    #pragma mark - Table view data source
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return self.musicArray.count;
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        QHMusic *music = self.musicArray[indexPath.row];
        static NSString *cellName = @"cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellName];
        }
        
        cell.imageView.image = [UIImage imageNamed:music.singerIcon];
        cell.textLabel.text = music.name;
        cell.detailTextLabel.text = music.singer;
        
        NSLog(@"%@",music.singer);
        
        NSLog(@"%@",cell.detailTextLabel.text);
        // Configure the cell...
        
        return cell;
    }
    
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 100;
    }
    
    -(BOOL)prefersStatusBarHidden
    {
        return YES;
    }
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //播放音乐
        
        QHMusic *music = self.musicArray[indexPath.row];
        
        //创建播放器
        
        NSURL *url = [[NSBundle mainBundle]URLForResource:music.filename withExtension:nil];
        
        //注意这里必须使用全局变量
        AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
        
        //缓冲(以便后面播放比较流畅)
        
        [audioPlayer prepareToPlay];
        
        //开始播放
        [audioPlayer play];
        
        self.audioPlayer = audioPlayer;
        
        
    }
    @end
    


    #import "QHMusic.h"
    
    @implementation QHMusic
    
    +(id)musicWithDict:(NSDictionary *)dict
    {
        return [[self alloc]initWithDict:dict];
    }
    
    -(id)initWithDict:(NSDictionary *)dict{
    
        if (self = [super init]) {
            [self setValuesForKeysWithDictionary:dict];
        }
        return self;
    }
    
    
    @end


    展开全文
  • 仿网易云音乐的播放进度条,有三种状态:播放、暂停和拖动
  • iOS 音乐播放器的实现

    2016-04-08 15:56:11
    iOS 音乐播放器的实现 一:现在好多公司都要开始植入音频播放,所以我也做研究下;音乐播放其实很简单,ios已经帮我们实现了这样的一个播放器 AVAudioPlayer。请看代码
  • 切入正题,我做的这款音乐播放器,实现的是播放本地音乐。有以下几个要点: 1.如何实现播放音乐? 2.如何切换当前正在播放的音乐资源? 3.如何监听音乐播放器的各种状态(播放器状态,播放的进度,缓冲的进度,...
  • 这篇文章上一版本是用audio组件开发的播放器,随后反应音频加载速度慢的问题 又用小程序内置的背景音乐播放的方法写了一遍,逻辑是一样的逻辑,希望对大家有所帮助! <view class='audiosBox'> <view ...
  • React Native (一) react-native-video实现音乐播放器进度条的功能 功能: 1.卡片滑动切歌 2.显示进度条 效果图: 第三方组件: 1.react-native-video Github地址:...
  • Xamarin iOS教程之进度条和滚动...QQ音乐播放器中也使用到了进度条,它可以让用户看到当前音乐播放了多少,还剩多少等。在Xamarin.iOS中也提供实现进度条的类,即UIProgressView。 【示例2-23】以下将实现进度条...
  • iOS开发--AVPlayer实现音乐播放器  标签: url音乐前端开发多线程 2015-12-28 15:35 5190人阅读 评论(2) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] ...
  • 功能描述:锁屏歌曲信息、控制台远程控制音乐播放:暂停/播放、上一首/下一首、快进/快退、锁屏状态下列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果)、歌词解析并随音乐...
  • 这款音乐播放器是基于QT开发的,用到了QMediaPlayer类实现音频播放,基本功能已经实现,ui的设计我是从某图网下载的,融合了好几种不同的方案改出来的,未来将试着将该播放器移植到树莓派,应用于智能音响上;...
  • 代码 JS var app = getApp() const innerAudioContext = wx.createInnerAudioContext(); const bgMusic = wx.getBackgroundAudioManager() Page({ /** * 页面的初始数据 */ data: { list: [], ... ...
  • iOS 简易音乐播放器

    2019-07-10 08:26:11
    每周五公司例行会议, 今天没学习Swift就给大家贴一些之前写的demo得了, 今天主要做一个简单的音乐播放器.先看下效果图 先主要说下功能, 进度条, 以及一个控制音量的slider, 还有一个btn控制播放以及暂停, 以及...
  • iOS开发系列, OC实现的迷你音乐播放器,包括基础音乐播放的基础功能:播放、暂停、上一首和下一首,除此之外还实现了歌词的滚动显示、进度更新、后台播放、远程控制以及来电处理等扩展功能。
  • 我也不知道为什么突然会想写一下音乐播放器的,感觉应该挺好的玩,自己把自己喜欢的歌曲导出来,用程序加载跑 起来,那歌听起来必定很带感啊。。。。。。不过那首Love Story被我听了无数遍。。。。。。听吐了 各位...
1 2 3 4 5 ... 20
收藏数 2,292
精华内容 916
关键字:

ios 音乐播放器进度条