MPMoviePlayerController的视图无法识别触摸

ber*_*ium 21 mpmovieplayercontroller ipad uigesturerecognizer ios

这是我的代码:

_mediaPlayer = [[MPMoviePlayerController alloc] init];
_mediaPlayer.controlStyle = MPMovieControlStyleNone;
_mediaPlayer.shouldAutoplay = NO;
[_mediaPlayer.view setFrame: CGRectMake(5, 5, 600,400)];
[playerHolder addSubview: _mediaPlayer.view];
//
[self prepareScreenContentToPlay];
//
UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleRollTap:)];
singleFingerTap.numberOfTapsRequired = 1;
[_mediaPlayer.view addGestureRecognizer:singleFingerTap];
[singleFingerTap release];
Run Code Online (Sandbox Code Playgroud)

和手势识别器的动作方法:

-(void)handleRollTap:(UITapGestureRecognizer*)sender{
    NSLog(@"%@", @"touch");
}
Run Code Online (Sandbox Code Playgroud)

MPMoviePlayerController工作正常.另外我想处理MPMoviePlayerController视图上的触摸但handleRollTap从未调用过.为什么MPMoviePlayerController的视图不适用于UITapGestureRecognizer?


好.如果singleFingerTap.numberOfTapsRequired = 2;那时一切正常.但没有什么可以单击...


mdo*_*ans 63

实际上,答案很简单:

  • 将自己设置为UIGestureRecognizer委托
  • 为委托方法返回YES:

例如

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture)];
tapGestureRecognizer.delegate = self;
Run Code Online (Sandbox Code Playgroud)

以及代码中的其他地方:

#pragma mark - gesture delegate
// this allows you to dispatch touches
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return YES;
}
// this enables you to handle multiple recognizers on single view
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
Run Code Online (Sandbox Code Playgroud)

  • 是.Normaly手势识别器假设它应该尽可能少地造成伤害.但是在极少数情况下,您希望将自定义触摸识别器添加到具有自己的识别器的视图中,您可以设置一个代理,可以在识别器协同工作时执行解析.这样的委托可以决定添加到视图中的每个识别器.这是一个非常有用的模式,减轻了以前利用黑客进入视图内部的方法所带来的许多痛苦. (7认同)

dev*_*vid 21

MPMoviePlayerController有一个占据其整个边界的子视图,该子视图上有3个手势识别器(在iOS 4.3中).

mp = [[MPMoviePlayerController alloc] initWithURL:movieURL];
mp.frame = aRectangle;

for (UIGestureRecognizer *g in ((UIView *)[mp.view.subviews objectAtIndex:0]).gestureRecognizers) {
    NSLog(@"g %@", g);
}
Run Code Online (Sandbox Code Playgroud)

将输出:

g <MPTapGestureRecognizer: 0x6224c30; baseClass = UIGestureRecognizer; state = Possible; cancelsTouchesInView = NO; view = <MPSwipableView 0x6416100>; target= <(action=_tapGestureRecognized:, target=<MPSwipableView 0x6416100>)>>
g <UIPinchGestureRecognizer: 0x6224710; state = Possible; cancelsTouchesInView = NO; delaysTouchesEnded = NO; view = <MPSwipableView 0x6416100>; target= <(action=_pinchGestureRecognized:, target=<MPSwipableView 0x6416100>)>>
g <MPActivityGestureRecognizer: 0x6224640; baseClass = UIGestureRecognizer; state = Possible; cancelsTouchesInView = NO; delaysTouchesEnded = NO; view = <MPSwipableView 0x6416100>; target= <(action=_activityGestureRecognized:, target=<MPSwipableView 0x6416100>)>>
Run Code Online (Sandbox Code Playgroud)

因此,已经有一个GestureRecognizer处理单击,但它不是UITapGestureRecognizer,而是MPTapGestureRecognizer(电影播放器​​的自定义识别器).

如果您创建一个通用视图并将其添加到电影播放器​​视图层次结构中,您可以添加触摸,但它会阻止对电影播放器​​的触摸(因此单击一下就不会使控件消失).

例如

UIView *aView = [[UIView alloc] initWithFrame:mp.view.bounds];
[aView addGestureRecognizer:tapGesture];
[mp.view addSubview:aView];
Run Code Online (Sandbox Code Playgroud)

这将获得你的点击,但你打破了控制.可能仍有一种方法可以让它与其他手势进行交互.


Ken*_*yen 8

只是为了分享我在播放器视图中添加自定义UISwipeGestureRecognizer的不同方法,而不添加自定义视图:

[[player.view.subviews objectAtIndex:0] addGestureRecognizer:swipeGesture];
Run Code Online (Sandbox Code Playgroud)

这是为了取代传统的呼叫方法

[player.view addGestureRecognizer:swipeGesture];
Run Code Online (Sandbox Code Playgroud)

因为它只适用于iPad非全屏模式和iPhone.当播放器在iPad上进入全屏模式时,手势无效