在iOS开发中,经常会遇到视频的播放,还好ios framework 给我们提供这样的控件-MediaPlayer
但是,要是用这个控件,先要将加入framework中,以及import;
#import <MediaPlayer/MediaPlayer.h>
我的设计思路大概是先设计一个视频cell,每个cell点进去会播放视频,再定义一个tablevc去包含这些cell;
好,接下来我们看代码:
我们先在viewcontroller中定义视频对象
/** 视频播放控制器*/
@property (nonatomic,strong) MPMoviePlayerController *moviePlayer;
/** 加载动画*/
@property(nonatomic,strong) UIActivityIndicatorView *loadingAni;
@property(nonatomic,strong)NSNotificationCenter *notificationCenter;
@property(nonatomic,strong)UIImageView *backmovieplayer;
我们自定义一个tableViewCell继承自UITableViewCell
@property(nonatomic,strong)UIButton *btn;
@property(nonatomic,strong)UIImageView *myImageView;
@property(nonatomic,strong)UILabel *Labeltitle;
@property(nonatomic,strong)UIImageView *btnimage;
@property(nonatomic,strong)UILabel *playcountLabel;
@property(nonatomic,strong)UIImageView *playcountImage;
@property(nonatomic,strong)UILabel *playtimeLabel;
@property(nonatomic,strong)UIImageView *playtimeImage;
具体就是tableViewCell的初始化实现
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if ([super initWithStyle:style reuseIdentifier:reuseIdentifier])
{
[self layoutCell];
}
return self;
}
-(void)layoutCell
{
self.btn =[[UIButton alloc]initWithFrame:CGRectMake(10, 20, [UIScreen mainScreen].bounds.size.width-20, 210)];
self.btnimage=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width-20, 210)];
[self.btn addSubview:self.btnimage];
[self.contentView addSubview:self.btn];
self.myImageView=[[UIImageView alloc]initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-30,90,40,40)];
self.myImageView.image=[UIImage imageNamed:@"audionews_index_play@2x.png"];
[self.btnimage addSubview:self.myImageView];
self.Labeltitle=[[UILabel alloc]initWithFrame:CGRectMake(10,235, [UIScreen mainScreen].bounds.size.width, 20)];
[self.Labeltitle setFont:[UIFont systemFontOfSize:14]];
[self.contentView addSubview:self.Labeltitle];
self.playcountLabel=[[UILabel alloc]initWithFrame:CGRectMake(10, 255, 250, 15)];
[self.playcountLabel setFont:[UIFont systemFontOfSize:10]];
[self.contentView addSubview:self.playcountLabel];
self.playcountImage=[[UIImageView alloc]initWithFrame:CGRectMake(10, 255, 15, 15)];
self.playcountImage.image=[UIImage imageNamed:@"night_video_list_cell_count@2x"];
[self.contentView addSubview:self.playcountImage];
self.playtimeLabel=[[UILabel alloc]initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width-40, 255, 45, 15)];
[self.playtimeLabel setFont:[UIFont systemFontOfSize:10]];
[self.contentView addSubview:self.playtimeLabel];
self.playtimeImage=[[UIImageView alloc]initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width-60, 255, 15, 15)];
self.playtimeImage.image=[UIImage imageNamed:@"night_audionews_indexheader_recent@2x"];
[self.contentView addSubview:self.playtimeImage];
}
MediaCell *cell=[tableView dequeueReusableCellWithIdentifier:@"cell"forIndexPath:indexPath];
// NSURL *imageUrl=[NSURL URLWithString:[[self.allDataArray objectAtIndex:indexPath.row] backImage]];
// [cell.btnimage sd_setImageWithURL:imageUrl];
[cell.btnimage setImage:[UIImage imageNamed:@"1"]];
cell.btn.tag=indexPath.row;
[cell.btn addTarget:self action:@selector(doput:) forControlEvents:UIControlEventTouchUpInside];
cell.Labeltitle.text=@"视频标题";
cell.playcountLabel.text=@"播放次数:4123";
if (cell.btnimage==nil)
{
[cell.myImageView removeFromSuperview];
}
cell.playtimeLabel.text=[NSString stringWithFormat:@"%02d:%02d",7,34];
接着是,注意,这个函数 didEndDisplayingCell是每个cell呈现完毕后就会被调用
-(void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (self.moviePlayer.playbackState==MPMoviePlaybackStatePlaying||self.moviePlayer.playbackState==MPMoviePlaybackStatePaused)
{
[self.backmovieplayer removeFromSuperview];
[self.moviePlayer.view removeFromSuperview];
self.moviePlayer=nil;
}
}
每个cell点击后开始播放视频,也就是这个函数cell点击后的回调函数
-(void)doput:(UIButton *)btn
{
if (self.moviePlayer.playbackState==MPMoviePlaybackStatePlaying||self.moviePlayer.playbackState==MPMoviePlaybackStatePaused)
{
[self.backmovieplayer removeFromSuperview];
[self.moviePlayer.view removeFromSuperview];
}
NSString *urlStr= @"http://flv2.bn.netease.com/videolib3/1511/19/RiCBl0272/SD/RiCBl0272-mobile.mp4";//[[self.allDataArray objectAtIndex:btn.tag] mp4_url];
NSString* UrlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url=[NSURL URLWithString:UrlStr];
if (!_moviePlayer) {
_moviePlayer=[[MPMoviePlayerController alloc]initWithContentURL:url];
_moviePlayer.view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
}
if ([self.moviePlayer isPreparedToPlay]) {
[_moviePlayer setContentURL:url];
[self.backmovieplayer removeFromSuperview];
}
self.moviePlayer.view.frame=CGRectMake(10,(btn.tag)*280+20,self.view.frame.size.width-20, 210);
self.loadingAni.frame=CGRectMake(self.moviePlayer.view.bounds.size.width/2-18.5,self.moviePlayer.view.bounds.size.height/2-18.5, 37, 37);
[self.myTableView addSubview:self.moviePlayer.view];
self.backmovieplayer=[[UIImageView alloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width-20, 210)];
self.backmovieplayer.image=[UIImage imageNamed:@"night_sidebar_cellhighlighted_bg@2x"];
[self.moviePlayer.view addSubview:self.backmovieplayer];
[self.backmovieplayer addSubview:self.loadingAni];
[self addNotification];
[self.loadingAni startAnimating];
[self.myTableView reloadData];
}
/**
* 播放状态改变,注意播放完成时的状态是暂停
*
* @param notification 通知对象
*/
-(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification{
[self.loadingAni stopAnimating];
[self.backmovieplayer removeFromSuperview];
if ([self.moviePlayer loadState]!=MPMovieLoadStateUnknown)
{
switch (self.moviePlayer.playbackState) {
case MPMoviePlaybackStatePlaying:
// NSLog(@"正在播放...");
break;
case MPMoviePlaybackStatePaused:
// NSLog(@"暂停播放.");
break;
case MPMoviePlaybackStateStopped:
// NSLog(@"停止播放.");
break;
default:
// NSLog(@"播放状态:%li",self.moviePlayer.playbackState);
break;
}
}
}