2

我有一个带有 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)。这就是为什么我[self.superview becomeFirstResponder];在类别中的每个 QTMovieView 的覆盖方法中包含该行。这并没有解决问题。

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

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

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

4

1 回答 1

0

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

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

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

于 2012-08-11T03:12:03.663 回答