QTMovieView单击并拖动中断键盘事件

时间:2012-08-10 18:49:07

标签: objective-c cocoa quicktime

我有一个带有QTMovieView的NSView。我的QTMovieView仅用于显示电影;我不希望用户能够以任何方式与其进行交互。在关于如何禁用拖动QTMovieView的令人失望的搜索之后,我遇到了这个解决方法,我在QTMovieView上实现了一个类别。它旨在覆盖QTMovieView的鼠标事件,并成功阻止用户拖动它或单击QTMovieView暂停它:

//QTMovieView+TFOverrideDrag.h

#import <QTKit/QTKit.h>

@interface QTMovieView (TFOverrideDrag)

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

@end

...

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

这可以有效防止用户拖动或暂停电影,并且正确调用NSLog语句。

问题是,点击QTMovieView后,QTMovieView的超级视图停止响应键盘事件(keyDown)。这就是我在类别中的每个QTMovieView重写方法中包含[self.superview becomeFirstResponder];行的原因。这并没有解决问题。

值得注意的是,QTMovieView的superview具有QTMovieView以外的子视图,其中一些是在QTMovieView之上绘制的。单击这些时,QTMovieView不会导致任何问题,程序继续正常运行。但是,在这种情况下仍然会调用NSLog语句。

我确信导致问题的确是QTMovieView,因为我在删除它之后运行了该程序,并且该区域中的所有点击都没有引起任何问题。

我的问题归结为:有没有人有更合理的解决方法而不是覆盖QTMovieView的鼠标事件以防止用户交互?如果没有,是否有人知道为什么QTMovieView框架内的点击会导致其超级视图停止响应键盘?或者,如果有一个不同于QTMovieView的类可以使用,我会对此持开放态度,尽管我确实需要利用QTMovieLoopsAttribute,因此任何其他类都需要提供该功能。

1 个答案:

答案 0 :(得分:0)

经过进一步的考虑,我找到了解决方案。我需要在我的类别中覆盖另外一个QTMovieView方法:

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

在我单击QTMovieView的框架之前,不会为keyDown事件调用log语句。一旦我这样做(这是我的keyDown事件以前开始被superview忽略的时候),就会调用log语句。但是,现在我将keyDown事件传递给nextResponder,superview正在做出相应的响应。我仍然对这种复杂的解决方案的需要感到恼火,所以如果有人有更优雅的东西,请分享!在那之前,我希望这可以帮助其他人遇到类似的问题!