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


Answers

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

이것은 당신의 수돗물을 얻을 것이다,하지만 당신은 컨트롤을 깰. 다른 제스처와 상호 작용할 수있는 방법이 여전히있을 수 있습니다.

Question

이것은 내 코드입니다.

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




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

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

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




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 입니다.




Related