【发布时间】:2017-12-01 15:06:01
【问题描述】:
我有一个包含 NSTableView 和 NSVisualEffectView 的 macOS 应用程序。视觉效果视图就像窗口底部的一个栏,它位于表格视图中(包含一些按钮/等)。
无论如何,如果我想通过拖动视觉效果视图来移动 NSWindow,它只有在表格视图不在视觉效果视图下方时才有效。我希望视觉效果视图位于表格视图上方的原因是,当用户滚动表格视图内容时,我可以获得很好的模糊效果。
但是,当视觉效果视图在表格视图上方时,鼠标/拖动/等事件不会被注册。相反,它们被传递到表视图。我怎样才能阻止这种情况发生?
我尝试继承 NSVisualEffectView,但我尝试的一切都失败了。这是我的代码:
#import <Cocoa/Cocoa.h>
@interface BottomMainBar : NSVisualEffectView {
}
@end
下面是实现代码:
#import "BottomMainBar.h"
@implementation BottomMainBar
/// DRAW RECT METHOD ///
-(void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
[self setWantsLayer:YES];
[self.window setMovableByWindowBackground:YES];
[self setAcceptsTouchEvents:YES];
[self registeredDraggedTypes];
}
/// OTHER METHODS ///
-(BOOL)mouseDownCanMoveWindow {
return YES;
}
-(BOOL)acceptsFirstMouse:(NSEvent *)event {
return YES;
}
-(void)mouseDown:(NSEvent *)event {}
-(void)mouseDragged:(NSEvent *)event {}
-(void)mouseUp:(NSEvent *)event {}
-(void)mouseEntered:(NSEvent *)event {}
-(void)mouseExited:(NSEvent *)event {}
@end
我没有尝试过,我怎样才能阻止视觉效果视图将鼠标事件传递给它下面的图层?
感谢您抽出宝贵时间,丹。
【问题讨论】:
-
你能不能在 NSVisualEffectView 上放一个透明的 NSView 来处理鼠标事件?作为奖励,如果这也不起作用,您就会知道事件处理问题实际上与 VEV 无关。
-
我不知道这会导致您的具体问题,但文档警告不要覆盖
-drawRect:。 -
感谢您的帮助@Ssswift - 最后我尝试了许多不同的东西,从自定义 NSWindow 类到 Apple 提供的不同 NSWindow 类型。最后我发现,我可以让鼠标按下事件传递到窗口标题栏,所以一件事导致了另一件事,我想出了一个解决方案,但无论如何感谢您的帮助。我将在几秒钟内发布我的解决方案(未使用任何库或私有 API)。
标签: objective-c macos cocoa nsview nswindow