QTMovieViewを含むNSViewがあります。私のQTMovieViewは、映画のみを表示することを目的としています。ユーザーがそれと対話できるようにしたくありません。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のスーパービューにはQTMovieView以外のサブビューがあり、その一部はQTMovieViewの上に描画されていることに注意してください。それらをクリックしても、QTMovieViewは問題を引き起こさず、プログラムは引き続き正常に実行されます。ただし、NSLogステートメントはこの状況でも呼び出されます。
プログラムを削除してから実行したので、問題の原因は確かにQTMovieViewであり、その領域でのすべてのクリックは問題を引き起こさないと確信しています。
私の質問はこれらに要約されます:ユーザーの相互作用を防ぐためにQTMovieViewのマウスイベントをオーバーライドするよりも合理的な回避策はありますか?そうでない場合、QTMovieViewのフレーム内でクリックすると、スーパービューがキーボードに応答しなくなる理由を誰かが知っていますか?または、QTMovieView以外に使用できる別のクラスがある場合は、QTMovieLoopsAttributeを利用する必要がありますが、それを受け入れる必要があるため、他のクラスはその機能を提供する必要があります。