拦截MPMoviePlayerController的点击事件

为了解决在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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值