ios - MPMoviePlayerController의 뷰가 터치를 인식하지 못합니다.





ipad uigesturerecognizer (7)


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.h 파일에 선언 된 CGPoint 입니다.

이것은 내 코드입니다.

_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; 모두 잘 작동합니다. 하지만 단일 탭을위한 아무것도 ..




사용자 지정보기를 추가하지 않고 사용자 지정 UISwipeGestureRecognizer를 플레이어보기에 추가하는 다른 방법을 공유하기 만하면됩니다.

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

이것은 기존의 호출 방법을 대체하는 것입니다.

[player.view addGestureRecognizer:swipeGesture];

iPad가 아닌 전체 화면 모드와 iPhone에서만 작동합니다. 플레이어가 iPad에서 전체 화면 모드로 전환하면 제스처가 작동하지 않습니다.




근본적인 원인은 새로운 제스처 인식기를 MPVideoBackgroundView에 추가해야한다는 것입니다. MPVideoBackgroundView는 MPMoviePlayerController 뷰의 하위 뷰입니다.




devdavid는 올바른 아이디어를 가지고 있지만, 그의 해결책은 나를 위해 작동하지 않았다. 나는 최신 버전의 플레이어에서 영화 플레이어보기 위에 다른보기가 있다고 생각합니다.

대신에 무비 플레이어 뷰 위에 UIView 추가했습니다. 이렇게하면 모든 제스처가 플레이어에게 전달되는 것을 막을 수 있습니다.하지만 모든 컨트롤을 표시하지 않으려 고하는 것이 전체 포인트였습니다.




사실, 이것에 대한 대답은 간단합니다.

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



MPMoviePlayerController의 최신 변종으로 받아 들여진 해결책은 여전히 ​​나를 위해 작동하지 않습니다.

또한 'UIView 스택 해킹'시도하고 내 자신의 UIView 제스처 인식자를 오버레이. 그러나 그것 모두는 효과가 없었습니다.

나는 마지막으로이 솔루션을 구현했습니다 : ' UIAplication 무시 '. 상단에있는 것처럼 보이지만 어쨌든 작동합니다. 터치 이벤트를 감지하면 일종의 깃발을 추가하거나 위임을하면 동영상을 중지 할 수 있습니다.




당신이하려고 시도하는 것은 (iTunes-) 합법적 인 경로에 머무르는 동안 매우 어렵습니다.

우선 올바른 방법으로 초안을 작성하겠습니다.

이 작업을 수행하는 올바른 방법은 UIAutomation을 사용하는 것입니다. UIAutomation은 사용자가 요구하는 것과 정확히 일치하며 모든 종류의 테스트에 대한 사용자 동작을 시뮬레이션합니다.

이제 그 어려운 방법;

문제가 해결되어야 할 문제는 새 UIEvent를 인스턴스화하는 것입니다. (Un) 다행히도 UIKit은 확실한 보안상의 이유로 이러한 이벤트에 대한 생성자를 제공하지 않습니다. 그러나 과거에 작동했던 해결 방법이 있습니다. 아직 해결되지 않았는지 확실하지 않습니다.

Matt Galagher의 멋진 블로그 solution 대한 solution 초안을 작성하십시오.





ios ipad mpmovieplayercontroller uigesturerecognizer