Представление MPMoviePlayerController не распознает касание - PullRequest
21 голосов
/ 20 сентября 2011

Это мой код:

_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];

И метод действия для распознавателя жестов:

-(void)handleRollTap:(UITapGestureRecognizer*)sender{
    NSLog(@"%@", @"touch");
}

MPMoviePlayerController работает нормально.Кроме того, я хочу обработать касание в представлении MPMoviePlayerController, но handleRollTap никогда не вызывается.Почему представление MPMoviePlayerController не работает с UITapGestureRecognizer?


ОК.Если singleFingerTap.numberOfTapsRequired = 2;, то все также работает нормально.Но ничего для одного крана ..


Ответы [ 7 ]

63 голосов
/ 15 октября 2012

На самом деле ответ на этот вопрос прост:

  • установите себя в качестве делегата UIGestureRecognizer
  • верните YES для методов делегата:

например,

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture)];
tapGestureRecognizer.delegate = self;

и где-то еще в коде:

#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;
}
21 голосов
/ 23 сентября 2011

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);
}

выведет:

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>)>>

Так что уже есть GestureRecognizer, который обрабатывает одно касание, но это не UITapGestureRecognizer, а MPTapGestureRecognizer (пользовательский распознаватель для проигрывателя фильмов).

Если вы создаете общий вид и добавляете его вИерархия просмотра проигрывателя фильмов, вы можете добавить к ней прикосновения, но это блокирует прикосновения к проигрывателю фильмов (поэтому одно касание не приведет к исчезновению элементов управления).

например,

UIView *aView = [[UIView alloc] initWithFrame:mp.view.bounds];
[aView addGestureRecognizer:tapGesture];
[mp.view addSubview:aView];

Это получит ваш кран, но вы нарушите управление.Возможно, еще есть способ, позволяющий ему взаимодействовать с другими жестами.

8 голосов
/ 01 декабря 2011

Просто чтобы поделиться моим другим подходом для добавления пользовательского UISwipeGestureRecognizer в представление проигрывателя без добавления настраиваемого представления:

[[player.view.subviews objectAtIndex:0] addGestureRecognizer:swipeGesture];

Это заменить обычный метод вызова

[player.view addGestureRecognizer:swipeGesture];

, так как он работает только в полноэкранном режиме iPad и на iPhone. Когда плеер переходит в полноэкранный режим на iPad, жест не работает

1 голос
/ 12 февраля 2013

Для этого можно использовать событие UIView UITouch.Возьмите UIView и поместите в него MPMoviePlayerController:

theMovie = [MPMoviePlayerController new];
theMovie.view.frame = CGRectMake(0, 0, 1024, 768);
[theMovie setContentURL:theURL];
[theMovie setScalingMode:MPMovieScalingModeAspectFit];
[theMovie setCurrentPlaybackTime:0.2];
[theMovie setFullscreen:YES animated:YES];
[self addSubview:theMovie.view];
[viewMovie addSubview:theMovie.view];

Использование UIView сенсорных методов делегирования

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touchesBegan");
    UITouch *touch = [touches anyObject];
    startPosition = [touch locationInView:self];
    [viewMovie touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touchesMoved");
    UITouch *touch = [touches anyObject];
    CGPoint endPosition = [touch locationInView:self];

    if (startPosition.x < endPosition.x)
    {
        NSLog(@"Left to Right");
    }
    else
    {
        NSLog(@"Right to Left");
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{

}

Где startPosition - это CGPoint, объявленное в .h файл.

0 голосов
/ 20 мая 2015

У devdavid правильная идея, но его решение не сработало для меня. Я полагаю, что в более новых версиях плеера над просмотром плеера есть другие виды.

Вместо этого я добавил UIView над просмотром видеоплеера. Это предотвратит попадание всех жестов на проигрыватель, но в этом все дело, так как я не хотел видеть какие-либо элементы управления.

0 голосов
/ 17 мая 2013

С последним вариантом MPMoviePlayerController принятое решение все еще не работает для меня.

Я также попытался «взломать стек UIView» и наложить свой собственный UIView с помощью распознавателей жестов.Но все это не сработало.

Я наконец-то реализовал это решение: ' Переопределение UIAplication ', что кажется чрезмерным способом сделать это, но в любом случае это работает.Просто добавьте к нему какой-нибудь флаг или делегат, когда вы обнаружите сенсорное событие, и вы сможете остановить фильм.

0 голосов
/ 20 сентября 2012

Основная причина в том, что новый распознаватель жестов должен быть добавлен в MPVideoBackgroundView, который является подпредставлением представления MPMoviePlayerController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...