2012-08-10 2 views
2

QTMovieView가있는 NSView가 있습니다. QTMovieView는 동영상 만 표시합니다. 나는 사용자가 어떤 식 으로든 그것과 상호 작용할 수 있기를 원하지 않는다. QTMovieView 끌기를 비활성화하는 방법에 대해 실망스러운 검색을 한 후에 QTMovieView에서 범주로 구현 한이 해결 방법을 발견했습니다. ...QTMovieView 클릭하여 드래그하면 키보드 이벤트가 중단됩니다.

//QTMovieView+TFOverrideDrag.m 

#import "QTMovieView+TFOverrideDrag.h" 

@implementation QTMovieView (TFOverrideDrag) 

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    [self.superview becomeFirstResponder]; 
    NSLog(@"MDown"); 
} 

- (void)mouseDragged:(NSEvent *)theEvent 
{ 
    [self.superview becomeFirstResponder]; 
    NSLog(@"MDrag"); 
} 

- (void)rightMouseDown:(NSEvent *)theEvent 
{ 
    [self.superview becomeFirstResponder]; 
    NSLog(@"RMouse"); 
} 
@end 

이를

//QTMovieView+TFOverrideDrag.h 

#import <QTKit/QTKit.h> 

@interface QTMovieView (TFOverrideDrag) 

- (void)mouseDown:(NSEvent *)theEvent; 
- (void)mouseDragged:(NSEvent *)theEvent; 
- (void)rightMouseDown:(NSEvent *)theEvent; 

@end 

을 : QTMovieView의 마우스 이벤트를 무시하도록하고 드래그하거나 일시 중지 QTMovieView을 클릭 할 수있는에서 사용자를 방지하는 데 성공한다 사용자가 영화를 드래그하거나 일시 중지하는 것을 방지하는 데 효과적이며 NSLog 문이 적절하게 호출됩니다.

문제는 QTMovieView를 클릭 한 후 QTMovieView의 수퍼 뷰가 키보드 이벤트 (keyDown)에 응답하지 않는다는 것입니다. 이 때문에 QTMovieView의 재정의 된 각 메소드에 [self.superview becomeFirstResponder]; 행을 포함 시켰습니다. 이것은 문제를 해결하지 못했습니다.

QTMovieView의 수퍼 뷰에는 QTMovieView 이외의 서브 뷰가 있으며, 그 중 일부는 QTMovieView 위에 그려져 있습니다. 클릭하면 QTMovieView가 문제를 일으키지 않고 프로그램이 계속 정상적으로 실행됩니다. 그러나 NSLog 문은 여전히이 상황에서 호출됩니다.

제거한 후 프로그램을 실행 했으므로 문제가 발생한 QTMovieView라는 사실을 확신하고 있으며 해당 영역의 모든 클릭이 아무런 문제가되지 않습니다.

내 질문은 다음과 같습니다. QTMovieView의 마우스 이벤트를 무시하여 사용자 상호 작용을 방지하는 것보다 합리적인 해결책이 있습니까? QTMovieView 프레임 내에서 클릭 수를 통해 수퍼 뷰가 키보드에 응답하지 않게되는 이유를 아는 사람이 있습니까? 또는 QTMovieView 이외의 다른 클래스를 사용할 수 있다면 QTMovieLoopsAttribute를 활용해야하지만 다른 클래스는 해당 기능을 제공해야합니다.

답변

0

몇 가지 추가 고려한 후에 해결책을 찾았습니다. 나는 QTMovieView의 프레임에서 클릭 할 때까지

- (void)keyDown:(NSEvent *)theEvent 
{ 
    [self.nextResponder keyDown:theEvent]; 
    NSLog(@"keyDown"); 
} 

로그 문이를 keyDown 이벤트에 대해 호출되지 않습니다 : 내 카테고리에 한 번 더 QTMovieView 메소드를 오버라이드 (override) 할 필요가 있었다. 일단 (내 keyDown 이벤트가 superview에 의해 이전에 무시되기 시작했을 때) 로그 문이 호출됩니다. 그러나 keyDown 이벤트를 nextResponder에 전달하면 superview가 적절하게 응답합니다. 나는 아직도 복잡한 회피 방법에 대한 필요성에 대해 짜증이났다. 누군가가 조금 더 우아한 것을 가지고 있다면 공유해라! 그때까지는 다른 사람들이 비슷한 문제에 직면 할 수 있기를 바랍니다.

관련 문제