3

継続的に更新するように設定された NSColorWell を使用しています。ユーザーがカラー パネルのカラー ピッカーからコントロールの編集 (マウスアップ) をいつ終了したかを知る必要があります。

イベント モニターをインストールし、マウス ダウンおよびマウス移動メッセージを正常に受信していますが、NSColorPanel がマウス アップをブロックしているように見えます。

肝心なのは、ユーザーが選択している間に生成されたすべての中間色なしで、最終的に選択された色を元に戻すスタックに追加したいということです。

カスタム NSColorPanel を作成し、共有パネルを mouseUp をオーバーライドしてメッセージを送信するという考えに置き換える方法はありますか?

私の調査では、この問題は何度か報告されていますが、成功した解決策を読んだことはありません。

よろしく、 - ジョージ・ローレンス・ストーム、キーンコヨーテ・インベンション・サービス

4

3 に答える 3

4

colorのキーパスを観察するNSColorPanelと、マウスアップ イベントで 1 回余分に呼び出されることがわかりました。NSColorWellこれにより、マウスの左ボタンが押されたときのアクション メッセージを無視し、キーパス オブザーバーから最終的な色を取得できます。

このアプリケーション デリゲートのサンプル コードcolorChanged:NSColorWellアクション メソッドです。

void* const ColorPanelColorContext = (void*)1001;

@interface AppDelegate()

@property (weak) NSColorWell *updatingColorWell;

@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    NSColorPanel *colorPanel = [NSColorPanel sharedColorPanel];
    [colorPanel addObserver:self forKeyPath:@"color" 
                    options:0 context:ColorPanelColorContext];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                        change:(NSDictionary *)change context:(void *)context {
    if (context == ColorPanelColorContext) {
        if (![self isLeftMouseButtonDown]) {
            if (self.updatingColorWell) {
                NSColorWell *colorWell = self.updatingColorWell;
                [colorWell sendAction:[colorWell action] to:[colorWell target]];
            }
            self.updatingColorWell = nil;
        }
    }
}

- (IBAction)colorChanged:(id)sender {
    if ([self isLeftMouseButtonDown]) {
        self.updatingColorWell = sender;
    } else {
        NSColorWell *colorWell = sender;
        [self updateFinalColor:[colorWell color]];
        self.updatingColorWell = nil;
    }
}

- (void)updateFinalColor:(NSColor*)color {
    // Do something with the final color...
}

- (BOOL)isLeftMouseButtonDown {
    return ([NSEvent pressedMouseButtons] & 1) == 1;
}

@end
于 2013-08-27T12:28:49.357 に答える
2

Interface Builder でカラー ウェルを選択し、Attributes Inspector の Continuous チェックボックスをオフにします。さらに、applicationDidFinishLaunching:メソッドまたはawakeFromNibメソッドなどの適切な場所に次のコード行を追加します。

[[NSColorPanel sharedColorPanel] setContinuous:NO];

NOつまり、これが正しく機能するためには、共有カラー パネルとカラー ウェルの両方が継続的に設定されている必要があります。

于 2014-03-28T04:27:59.550 に答える
0

あなたが望むことを行う適切な方法は、NSUndoManagerのを使用することです-begin/endUndoGrouping。だからあなたはこのようなことをするでしょう

[undoManager beginUndoGrouping];
// ... whatever code you need to show the color picker
// ...then when the color has been chosen
[undoManager endUndoGrouping];

元に戻すグループの目的は、まさにあなたが達成しようとしているものです。つまり、すべての変更を単一の元に戻すことです。

于 2013-01-03T15:54:43.080 に答える