我有一个带有 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,因此任何其他类都需要提供该功能。