事件在透明 NSWindow 中的 NSView 中不起作用

Posted

技术标签:

【中文标题】事件在透明 NSWindow 中的 NSView 中不起作用【英文标题】:Events not working in NSView in transparent NSWindow 【发布时间】:2011-02-10 21:15:24 【问题描述】:

我一直在使用这个代码...

static const CGFloat kSwipeGestureLeft  =  1.0;
static const CGFloat kSwipeGestureRight = -1.0;
static const CGFloat kSwipeGestureUp    =  1.0;
static const CGFloat kSwipeGestureDown  = -1.0;

- (void)swipeWithEvent:(NSEvent *)event 

    if ([event deltaX] == kSwipeGestureLeft) 

        NSLog(@"LEFT SWIPE!");
     
    else if ([event deltaX] == kSwipeGestureRight) 

        NSLog(@"RIGHT SWIPE!");
     
    else if ([event deltaY] == kSwipeGestureUp) 

        NSLog(@"UP SWIPE!");
     
    else if ([event deltaY] == kSwipeGestureDown) 

        NSLog(@"DOWN SWIPE!");
     
    else 
        [super swipeWithEvent:event];
    

NSView 中,它在 Interface Builder发送到后面在我制作的窗口内 通过代码实现strong>部分透明但是,它**似乎只在不透明窗口内工作,而不是在透明窗口内。

为什么?我怎样才能解决这个问题?如果我不能做到这一点,我仍然可以,比如拍摄整个屏幕然后将其设置(稍微变暗)作为窗口的背景?

我尝试将 NSWindow** 子类化并将其放入,但它仍然不起作用。

我使用的代码实际上并没有使窗口透明,只是将其背景颜色更改为透明:

    //Set up the window

[window setLevel:kCGNormalWindowLevel];
[window setOpaque:NO];
[window setStyleMask:0];
[window setBackgroundColor:[NSColor colorWithCalibratedWhite:0.0 alpha:0.3]];
[window setAlphaValue:0];


    //Resize the window to fill the screen

[window
 setFrame:[window frameRectForContentRect:[[window screen] frame]]
 display:YES
 animate:YES];

    //Fade the window in

[window makeKeyAndOrderFront:self];
[[window animator] setAlphaValue:1.0]; 

【问题讨论】:

你用什么代码来设置 NSWindow 的不透明度? 我现在已将其添加到问题中! :) 从您的外观看来,您似乎正在尝试全屏显示视图。在这种情况下,您是否考虑过使用 NSView 的 -enterFullScreenMode:withOptions: 方法而不是试图让窗口填满屏幕? 【参考方案1】:

确保您的窗口实际上是关键窗口。也就是说,不要假设 makeKeyAndOrderFront 成功地使您的窗口成为关键窗口。有关详细信息,请参阅 -[NSWindow canBecomeKeyWindow] 方法(您可能必须为自定义窗口覆盖它才能返回 YES)。对于没有标题栏的窗口,我过去曾遇到过这个问题,不确定您是否遇到相同(或类似)的问题。

【讨论】:

我覆盖了自定义窗口并在窗口上也调用了“makeKeyWindow”,但它仍然不起作用。 :( 您是否在 NSWindow 子类中实现了 canBecomeKeyWindow 以始终返回 YES?它被调用了吗? 我实现了 canBecomeKeyWindow 以始终返回 YES,但是当我调用 makeKeyWindow 时,它说它不能......【参考方案2】:

不要将 alpha 设置为 0,而是将其设置为像 0.01 这样的低值。对于完全透明的视图,事件会被忽略。

【讨论】:

好的,我将透明度设置为 0.01,但没有帮助。 不确定这是否有帮助,但请尝试在您的窗口上设置 setIgnoresMouseEvents:YES。【参考方案3】:

你在使用 UIGestureRecognizer 吗?这似乎是目前使用的最简单的方法:)

【讨论】:

Mac OS X 上没有UIGestureRecognizer

以上是关于事件在透明 NSWindow 中的 NSView 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个 NSView 下阻止 NSView 事件?

将 NSWindow 显示为 NSView 的子视图

NSLayoutConstraint 防止 NSWindow 调整大小

如何以编程方式将视图添加到 NSWindow(或 NSView)?

macOS AppKit 的事件响应简介

如何在移动 NSView 时接收通知