我使用的是设置为持续更新的NSColorWell。我需要知道用户何时完成了从颜色面板中的颜色选择器编辑控件(鼠标向上)。
我安装了一个事件监视器,并且成功地接收到鼠标按下和鼠标移动的消息,但是NSColorPanel似乎阻止了鼠标释放。
底线是,我希望将最终选择的颜色添加到我的撤消堆栈中,而不是在用户选择他们的选择时生成所有中间颜色。
有没有一种方法可以创建一个自定义的NSColorPanel,并用覆盖它的mouseUp并发送消息的想法来替换共享面板?
在我的研究中,这个问题已经被提出了几次,但是我还没有读到一个成功的解决方案。
尊敬的乔治·劳伦斯·斯托姆,Keencoyote发明服务公司
发布于 2013-08-27 20:28:49
我发现,如果我们观察NSColorPanel的color keypath,我们会在鼠标打开事件上被额外调用一次。这使我们可以在鼠标左键按下时忽略来自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发布于 2014-03-28 12:28:00
在界面生成器中,选择您的颜色井,然后取消选中属性检查器中的连续复选框。此外,在适当的位置添加以下代码行,如在applicationDidFinishLaunching:方法或awakeFromNib方法中:
[[NSColorPanel sharedColorPanel] setContinuous:NO];换句话说,共享颜色面板和颜色都需要连续设置为NO才能正常工作。
发布于 2013-01-03 23:54:43
做你想做的事情的正确方法是使用NSUndoManager的-begin/endUndoGrouping。
[undoManager beginUndoGrouping];
// ... whatever code you need to show the color picker
// ...then when the color has been chosen
[undoManager endUndoGrouping];撤消组的目的正是您试图实现的--将所有更改合并到一个撤消中。
https://stackoverflow.com/questions/14138852
复制相似问题