iOS开发中播放音乐可以使用MPMusicPlayerController类来实现,播放视频可以使用MPMoviePlayerController和MPMoviePlayerViewController类来实现,同时MPMediaPickerController
类可以用于从系统媒体库中选择媒体播放。这几个类都包含与MediaPlayer.framework框架中。

这里主要介绍MediaPlayer.framework

指定根视图:

    RootTableViewController *rootTVC = [[RootTableViewController alloc] initWithStyle:UITableViewStylePlain];
    UINavigationController *rootNC = [[UINavigationController alloc] initWithRootViewController:rootTVC];
    self.window.rootViewController = rootNC;

RootTableViewController.m

设置相关属性:

#import "RootTableViewController.h"
#import "TestCell.h"
#import "TestModel.h"
#import "UIImageView+WebCache.h"
#import <MediaPlayer/MediaPlayer.h>

@interface RootTableViewController ()

@property (nonatomic, strong) MPMoviePlayerViewController *mpPVC;

@property (nonatomic, strong) NSMutableArray *dataSourceArray;

@property (nonatomic, strong) NSIndexPath *selectedIndexPath;

@property (nonatomic, assign) CGRect selectedRect;

@end

@implementation RootTableViewController

调用:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.tableView registerNib:[UINib nibWithNibName:@"TestCell" bundle:nil] forCellReuseIdentifier:@"testCell"];
    self.dataSourceArray = [NSMutableArray array];

    [self loadDataAndShow];

}

加载网络数据:

- (void)loadDataAndShow
{
    NSURL *url = [NSURL URLWithString:@"http://c.m.163.com/nc/video/list/V9LG4B3A0/y/1-20.html"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        if (data != nil) {
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            NSArray *array = dict[@"V9LG4B3A0"];
            for (NSDictionary *aDict in array) {
                TestModel *model = [[TestModel alloc] init];
                [model setValuesForKeysWithDictionary:aDict];
                [self.dataSourceArray addObject:model];
            }

            [self.tableView reloadData];
        } else {
            NSLog(@"%@", [connectionError localizedDescription]);
        }

    }];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.dataSourceArray.count;
}

返回cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TestCell *cell = [tableView dequeueReusableCellWithIdentifier:@"testCell" forIndexPath:indexPath];
    TestModel *model = self.dataSourceArray[indexPath.row];
    [cell.movieImageView sd_setImageWithURL:[NSURL URLWithString:model.cover]];

    UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
    [cell.movieImageView addGestureRecognizer:tapGR];

    return cell;
}

添加手势:

- (void)tapAction:(UITapGestureRecognizer *)sender
{
    if (self.mpPVC.view) {
        [self.mpPVC.view removeFromSuperview];
    }
    UIView *view = sender.view;
    UITableViewCell *cell = (UITableViewCell *)view.superview.superview;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    self.selectedIndexPath = indexPath;
    TestModel *model = self.dataSourceArray[indexPath.row];
    self.mpPVC = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:model.mp4_url]];

    self.mpPVC.view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 370);
    [self.mpPVC.moviePlayer setScalingMode:MPMovieScalingModeAspectFill];
    [self.mpPVC.moviePlayer setControlStyle:MPMovieControlStyleEmbedded];
    [cell addSubview:self.mpPVC.view];

}

返回高:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 370;
}

添加划出屏幕小窗口效果:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    TestCell *cell = (TestCell *)[self.tableView cellForRowAtIndexPath:self.selectedIndexPath];
    // 当前cell在tableView的坐标
    CGRect rectInTableView = [self.tableView rectForRowAtIndexPath:self.selectedIndexPath];
    CGRect rectInWindow = [self.tableView convertRect:rectInTableView toView:[self.tableView superview]];
    self.selectedRect = CGRectMake(rectInTableView.origin.x, rectInTableView.origin.y, cell.movieImageView.bounds.size.width + 20, cell.movieImageView.bounds.size.height + 20);

    if ([self.mpPVC.moviePlayer isPreparedToPlay]) {
        if (rectInWindow.origin.y <= -370 || rectInWindow.origin.y >= [UIScreen mainScreen].bounds.size.height) {
            [UIView animateWithDuration:.5 animations:^{

                self.mpPVC.view.frame = CGRectMake(self.view.bounds.size.width - 170, self.view.bounds.size.height - 170, 170, 170);
                [self.view.window addSubview:self.mpPVC.view];
                self.mpPVC.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;

            }];
        } else {
            self.mpPVC.view.frame = self.selectedRect;
            [self.tableView addSubview:self.mpPVC.view];
            self.mpPVC.moviePlayer.controlStyle = MPMovieControlStyleDefault;
        }
    }

}

自定义cell

//.h
#import <UIKit/UIKit.h>

@interface TestCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UIImageView *movieImageView;

@end

//.m
- (void)awakeFromNib
{
    self.movieImageView.userInteractionEnabled = YES;
}

cell布局如下

添加model类:

//.h
#import <Foundation/Foundation.h>

@interface TestModel : NSObject

@property (nonatomic, copy) NSString *cover;
@property (nonatomic, copy) NSString *mp4_url;

@end

//.m
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{

}

最终效果:

每日更新关注:http://weibo.com/hanjunqiang 
新浪微博

iOS中 MediaPlayer framework实现视频播放 韩俊强的博客的更多相关文章

  1. iOS中 动态热修补技术JSPatch 韩俊强的博客

    .1.4) JSPatch bridge Objective-C and JavaScript. You can call any Objective-C class and method in Ja ...

  2. iOS中 最新支付宝支付(AliPay) 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 现在的支付方式一般有三种, 支付宝, 微信, 网银. 个人觉得最简单易用的还是支付宝, 微信虽然看起来币支付宝要简单 ...

  3. iOS中 Realm错误总结整理 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 一.错误信息:Attempting to modify object outside of a write tra ...

  4. iOS中 断点下载详解 韩俊强的博客

    布局如下: 基本拖拉属性: #import "ViewController.h" #import "AFNetworking.h" @interface Vie ...

  5. HTML5中 基本用法及属性 韩俊强的博客

    从今天开始更新H5相关学习:希望大家能一起学习,多学习一门语言,多一门乐趣! 了解Html5: Html5基本属性: <!DOCTYPE html> <html lang=" ...

  6. iOS开发中的零碎知识点笔记 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 1.关联 objc_setAssociatedObject关联是指把两个对象相互关联起来,使得其中的一个对象作为另外 ...

  7. iOS中 扫描二维码/生成二维码详解 韩俊强的博客

    最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: se ...

  8. iOS中 扫描二维码/生成二维码具体解释 韩俊强的博客

    近期大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: se ...

  9. iOS中 HTTP/Socket/TCP/IP通信协议具体解释 韩俊强的博客

    简介: // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 / ...

随机推荐

  1. VMWare 学习目录

    Linux介绍 Linux入门--个人感想 Google怎么用linux 初入Linux Windows XP硬盘安装Ubuntu 12.04双系统图文详解 实例讲解虚拟机3种网络模式(桥接.nat. ...

  2. text-align:center属性失效

    text-align:center只对inline元素有效,失效的情况下 给它所有的子元素加上 display:inline-block即可 inline-block不兼容ie6

  3. 软件测试assert

    之前实习做过一段时间测试,现做个总结: 实习测试的是一款CM系统(case 系统),来记录IT部门处理的维修,服务,反馈,预定服务等case:b/s架构,人少小项目,实习时间短,去了已经快完工,主要测 ...

  4. 初识RabbitMQ系列之三:.net 如何使用RabbitMQ

    话不多说,直接上代码! 一:搭建一个解决方案框架:RabbitMQ_Demo 其中包含4个部分: 1:RabbitMQ 公用类库项目 2:一个生产者控制台项目 3:两个消费者控制台项目 项目结构如图: ...

  5. Intellij IDEA自动编译问题

    对IDEA的界面很有爱,但是感到他的项目启动速度太慢了.所以查了资料做了优化. 1:开启自动测试 File->setting->compiler 勾选上上面的,     2修改run/de ...

  6. ERP中的地区管理

    地区管理 地区管理主要实现地区数据的添加.编辑.查看.启用.禁用等功能,另外还包含地区选择控件封装. 业务功能点: 地区数据查看:地区列表树状展现,列表增加省.市.区.县.乡图标. 地区选择控件:选择 ...

  7. String字符串的操作

    字符串的常用操作 # Author:nadech name = "my name is nadech" print(name.count("a")) print ...

  8. Python3 元组

    Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 = ('Goog ...

  9. day08 JSP

    day08 JSP 1. jsp 入门和 jsp 运行原理 2. jsp 语法 2.1 jsp 模板元素:jsp 页面中的 html 内容.它定义了网络基本骨架,即定义了页面结构和外观. 2.2 js ...

  10. Android Multimedia框架总结(二十四)MediaMuxer实现手机屏幕录制成gif图

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53866405 前言:上篇中,介绍 ...