首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSColorPanel阻止鼠标释放事件

NSColorPanel阻止鼠标释放事件
EN

Stack Overflow用户
提问于 2013-01-03 20:20:35
回答 3查看 721关注 0票数 3

我使用的是设置为持续更新的NSColorWell。我需要知道用户何时完成了从颜色面板中的颜色选择器编辑控件(鼠标向上)。

我安装了一个事件监视器,并且成功地接收到鼠标按下和鼠标移动的消息,但是NSColorPanel似乎阻止了鼠标释放。

底线是,我希望将最终选择的颜色添加到我的撤消堆栈中,而不是在用户选择他们的选择时生成所有中间颜色。

有没有一种方法可以创建一个自定义的NSColorPanel,并用覆盖它的mouseUp并发送消息的想法来替换共享面板?

在我的研究中,这个问题已经被提出了几次,但是我还没有读到一个成功的解决方案。

尊敬的乔治·劳伦斯·斯托姆,Keencoyote发明服务公司

EN

回答 3

Stack Overflow用户

发布于 2013-08-27 20:28:49

我发现,如果我们观察NSColorPanelcolor keypath,我们会在鼠标打开事件上被额外调用一次。这使我们可以在鼠标左键按下时忽略来自NSColorWell的操作消息,并从键盘路径观察者那里获得最终颜色。

在此应用程序中,委托示例代码colorChanged:是一个NSColorWell操作方法。

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2014-03-28 12:28:00

在界面生成器中,选择您的颜色井,然后取消选中属性检查器中的连续复选框。此外,在适当的位置添加以下代码行,如在applicationDidFinishLaunching:方法或awakeFromNib方法中:

代码语言:javascript
复制
[[NSColorPanel sharedColorPanel] setContinuous:NO];

换句话说,共享颜色面板和颜色都需要连续设置为NO才能正常工作。

票数 2
EN

Stack Overflow用户

发布于 2013-01-03 23:54:43

做你想做的事情的正确方法是使用NSUndoManager-begin/endUndoGrouping

代码语言:javascript
复制
[undoManager beginUndoGrouping];
// ... whatever code you need to show the color picker
// ...then when the color has been chosen
[undoManager endUndoGrouping];

撤消组的目的正是您试图实现的--将所有更改合并到一个撤消中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14138852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档