Просмотр MPMoviePlayerController не распознает прикосновение
Это мой код:
_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?
OK. Если singleFingerTap.numberOfTapsRequired = 2;
, то все работает отлично. Но ничего для одного крана..
Ответы
Ответ 1
Собственно, ответ на это прост:
- укажите себя как делегат UIGestureRecognizer
- return 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;
}
Ответ 2
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];
Это приведет к крану, но вы нарушите управление. Возможно, еще есть способ разрешить ему взаимодействовать с другими жестами.
Ответ 3
Просто чтобы разделить мой другой подход для добавления пользовательского UISwipeGestureRecognizer к просмотру плеера без добавления пользовательского представления:
[[player.view.subviews objectAtIndex:0] addGestureRecognizer:swipeGesture];
Это замена обычного метода вызова
[player.view addGestureRecognizer:swipeGesture];
поскольку он работает только в не полноэкранном режиме iPad и на iPhone. Когда плеер переходит в полноэкранный режим на iPad, жест не работает.
Ответ 4
Вы можете использовать для этого событие 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
.
Ответ 5
Основная причина заключается в том, что новый распознаватель жестов должен быть добавлен в MPVideoBackgroundView, что является подзором представления MPMoviePlayerController.
Ответ 6
С последним вариантом MPMoviePlayerController принятое решение все еще не работает для меня.
Я также попытался "взломать стек UIView" и наложил свой собственный UIView на распознаватели жестов. Но все это не сработало.
Я, наконец, реализовал это решение: Переопределение UIAplication ', который, по-видимому, превосходит его, но в любом случае он работает. Просто добавьте какой-то флаг или делегируйте его, когда вы обнаружите событие касания, и вы можете остановить фильм.
Ответ 7
devdavid имеет правильную идею, но его решение не сработало для меня. Я думаю, что в более новых версиях проигрывателя есть другие виды над просмотром фильма.
Вместо этого я добавил UIView
над просмотром фильма. Это предотвратит все попытки передачи жестов игроку, но в этом весь смысл, поскольку я не хотел видеть никаких видимых элементов управления.