我正在尝试实现一个弹出式菜单(在Chrome中可以看到的东西,当光标在左箭头上时,我按下鼠标右键)。
我有一个派生自NSToolBarItem
的类,我有另一个派生自NSToolBar
的类。在工具栏中,我调用了setAllowsUserCustomization
。所以我右键单击工具栏上的任意位置都会显示工具栏的自定义菜单。
感谢您提供任何指针。
答案 0 :(得分:2)
您不需要继承NSToolbarItem
。只需给出一个工具栏项its own view(代码或IB)。在该视图中,您可以使用像NSPopUpButton
这样的标准控件,或者使用您喜欢的任何事件处理逻辑的自定义视图。
答案 1 :(得分:0)
如果您希望NSToolbarItem自定义视图接收mouseDown事件,您可以遵循以下模式:使用自定义NSWindow子类(或调整-[NSWindow hitTest:]
方法)并自行将事件转发给您的视图。
// MyWindow.h
@interface MyWindow : NSWindow
@end
@interface NSView (MyWindow)
- (BOOL)interceptsToolbarRightMouseDownEvents;
@end
// MyWindow.m
@implementation NSView (MyWindow)
- (BOOL)interceptsToolbarRightMouseDownEvents { // overload in your custom toolbar item view return YES
return NO;
}
@end
@interface NSToolbarView : NSView /* this class is hidden in AppKit */ @end
@implementation MyWindow
- (void)sendEvent:(NSEvent*)event {
if (event.type == NSRightMouseDown) {
NSView* frameView = [self.contentView superview];
NSView* view = [frameView hitTest:[frameView convertPoint:event.locationInWindow fromView:nil]];
if ([view isKindOfClass:NSToolbarView.class])
for (NSView* subview in view.subviews) {
NSView* view = [subview hitTest:[subview convertPoint:event.locationInWindow fromView:nil]];
if (view.interceptsToolbarRightMouseDownEvents)
return [view rightMouseDown:event];
}
}
[super sendEvent:event];
}
@end