拦截MPMoviePlayerController的点击事件

简介: 为了解决在MPMovieController上添加一个和控制栏一起显示的按钮,特别研究了一下MPMoviePlayerController的结构 (controlStyle是default,为了便于查看,省去了部分输出): (lldb)...

为了解决在MPMovieController上添加一个和控制栏一起显示的按钮,特别研究了一下MPMoviePlayerController的结构 (controlStyle是default,为了便于查看,省去了部分输出):

(lldb) po [m_view recursiveDescription]

(id) $1 = 0x179529f0 <UIView: 0xfdb55f0; frame = (0 0; 604 256); layer = <CALayer: 0xfd83a10>>

   | <MPMovieView: 0xde71d70; frame = (0 0; 604 256); 

   |    | <MPSwipableView: 0x1d774dc0; frame = (0 0; 604 256); 

   |    |    | <MPVideoBackgroundView: 0x1d775160; frame = (0 0; 604 256); 

   |    |    |    | <UIView: 0x1d776160; frame = (0 0; 604 256); 

   |    |    |    | <MPVideoView: 0x1d7740e0; frame = (0 0; 604 256); 

   |    |    |    |    | <UIView: 0x1d773fc0; frame = (142 -32; 320 320); 

   |    |    |    |    |    | <MPVideoBufferLayerContainer: 0x1d772050> (layer)

   |    |    |    |    |    |    | <MPVideoBufferLayer: 0x22ebdb20> (layer)

   |    |    |    |    |    |    |    | <AVPlayerLayerContentLayer: 0xf99d780> (layer)

   |    |    |    |    |    |    |    |    | <FigVideoLayer: 0xdbaab80> (layer)

   |    |    |    |    |    |    |    | <AVPlayerLayerSubtitleLayer: 0x22eaf480> (layer)

   |    |    |    |    |    |    |    |    | <AVSubtitleTextLayer: 0x22ea70f0> (layer)

   |    |    |    | <MPInlineVideoOverlay: 0x1d77e7c0; frame = (0 0; 604 256); 

   |    |    |    |    | <MPInlineTransportControls: 0x1d77edc0; frame = (0 212; 604 44);

   |    |    |    |    |    | <MPDetailSlider: 0x1d7837c0; baseClass = UISlider; frame = (70 12; 475 24); 

   |    |    |    |    |    |    | <UILabel: 0x1d78e1b0; frame = (-8 -2; 45 25); text = '0:00';

   |    |    |    |    |    |    | <UILabel: 0x1d78e240; frame = (438 -2; 45 25); text = '-0:00'; 

   |    |    |    |    |    |    | <UIImageView: 0x1d78e300; frame = (68 5; 360 11); 

   |    |    |    |    |    |    | <UIImageView: 0x1d78e3a0; frame = (47 5; 21 11); 

   |    |    |    |    |    |    | <UIImageView: 0x1d78c7e0; frame = (47 6; 381 10); 

   |    |    |    |    |    |    | <UIImageView: 0x1d78e430; frame = (57 2; 22 21); 

   |    |    |    |    |    | <MPTransportButton: 0x1d785a50; baseClass = UIButton; frame = (34 14; 16 18); 

   |    |    |    |    |    |    | <UIImageView: 0x1d785c70; frame = (0 0; 16 18); 

   |    |    |    |    |    |    | <UIImageView: 0x1d785bb0; frame = (-42 -41; 100 100); 

   |    |    |    |    |    | <MPTransportButton: 0x1d785dd0; baseClass = UIButton; frame = (564 16; 13 14); 

   |    |    |    |    |    |    | <UIImageView: 0x1d785ff0; frame = (0 0; 13 14); 

   |    |    |    |    |    |    | <UIImageView: 0x1d785f30; frame = (-43.5 -43; 100 100); 

   |    |    |    |    |    | <UILabel: 0xde72ce0; frame = (265 13; 74 19); text = 'Loading…'; 

   |    |    |    |    |    | <UIActivityIndicatorView: 0xde730d0; frame = (239 12; 20 20); 

   |    |    |    |    |    |    | <UIImageView: 0xde77e90; frame = (0 0; 20 20); 

   |    |    |    |    | <MPNowPlayingItemQueueInfoButton: 0x1d786690; baseClass = UIButton; frame = (251 10; 103 23); 

   |    |    |    |    |    | <UIImageView: 0x1d786750; frame = (0 0; 103 23); 

   |    |    |    |    |    | <UIButtonLabel: 0x1d788a50; frame = (0 0; 0 0); 


MPInlineVideoOverlay是显示控制栏的浮动view。Touches事件的获取要基于MPVideoBackgroundView进行处理。其中两个MPTransportButton分别是播放和全屏按钮。


对于事件获取,可以使用添加一个UITapGestureRecognizer的方式,不过这种方式会导致原来的操作失效,因为相关的事件被拦截了。另外一种简单的方式是向现有的UITapGestureRecognizer添加一个target即可,这样不会打乱原先的消息传递:


-(void) addTargetActionToGesture:(UIView *)view

{

    NSArray * gestureGroup = [view gestureRecognizers];

    for(UITapGestureRecognizer * g in gestureGroup)

    {

        [g addTarget:selfaction:@selector(handleMoviePressed:)];

    }

}


*iOS 6.0同之前的版本有所不同,事件必须绑定在MPVideoBackgroundView上。如果以UITapGestureRecognizer进行判断处理更为有效。


转载请注明出处:http://blog.csdn.net/horkychen


目录
相关文章
|
7月前
|
小程序 JavaScript
小程序绑定事件跳转的三种方法
小程序绑定事件跳转的三种方法
161 0
|
1月前
移动端click事件、touch事件、tap事件的区别
移动端click事件、touch事件、tap事件的区别
43 0
|
1月前
失焦事件和点击事件
失焦事件和点击事件
21 1
|
8月前
|
JavaScript
js事件拦截
js事件拦截
28 0
|
JavaScript 前端开发
Odoo 自定义form表单按钮点击事件处理程序
Odoo 自定义form表单按钮点击事件处理程序
245 0
|
Web App开发 安全 前端开发
新开窗口的那些事:拦截、安全、target
前端开发经常会遇到需要新开窗口的需求,而某些时候,新窗口的地址需要通过接口返回,经常就会遇到新开窗口被拦截的情况,这里说一下新开窗口的几种方式、被拦截的原因以及如何避免被拦截、新窗口安全、target 的秘密。
|
开发者
移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法
移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法
437 0
|
XML 程序员 Android开发
【Android开发】三种方法实现Button点击事件响应
【Android开发】三种方法实现Button点击事件响应
467 0
【Android开发】三种方法实现Button点击事件响应
|
开发工具 git
判断是长按还是点击事件
在识别二维码的时候,我们需要判断用户的行为是点击事件还是长按,如果是点击事件不做操作,如果是长按事件,就识别二维码 git地址:https://github.
1730 0

热门文章

最新文章