2

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を利用する必要がありますが、それを受け入れる必要があるため、他のクラスはその機能を提供する必要があります。

4

1 に答える 1

0

さらに検討した結果、解決策を見つけました。カテゴリ内のもう1つのQTMovieViewメソッドをオーバーライドする必要がありました。

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

QTMovieViewのフレームをクリックするまで、keyDownイベントに対してlogステートメントは呼び出されません。これを実行すると(これは、以前にkeyDownイベントがスーパービューによって無視され始めたときです)、logステートメントが呼び出されます。ただし、keyDownイベントをnextResponderに渡しているので、スーパービューは適切に応答しています。私はまだそのような複雑な回避策の必要性に悩まされているので、誰かがもう少しエレガントなものを持っているなら、共有してください!それまでは、これが他の人が同様の問題に遭遇するのに役立つことを願っています!

于 2012-08-11T03:12:03.663 に答える