没有窗口的可可popover

时间:2016-05-26 16:15:58

标签: macos cocoa

我在Cocoa开发方面是全新的,我想知道是否可以通过热键在任何位置显示popover。 OS X词典应用程序非常接近所需的结果。我想只显示popover,光标位置没有窗口。如果有可能,请为这个popover提供一些代码吗?

非常感谢你。

1 个答案:

答案 0 :(得分:2)

我做了类似这样的事情用于实验目的。诀窍是创建一个透明背景或零尺寸的自定义无边框窗口。

创建,展示&定位窗口,可以从中显示弹出窗口。

窗口创建:
目标C

implicit class TLWrapper(t: TraversableLike[String,_]){
     def show = t.mkString(t.stringPrefix + "(\"", "\", \"", "\")")
}

scala> List("red, green","yellow, blue").show
res10: String = List("red, green", "yellow, blue")

<强>夫特

NSWindow* window = [[NSWindow alloc] initWithContentRect:windowRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
window.opaque = NO;
window.backgroundColor = [NSColor clearColor];
window.level = NSStatusWindowLevel;
window.accessibilityHidden = YES;
[window makeKeyAndOrderFront:nil];
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];

对于popover:
目标C

window = NSWindow(contentRect: windowRect, styleMask: NSBorderlessWindowMask, backing: .Buffered, defer: true)
window.opaque = false
window.backgroundColor = NSColor.clearColor()
window.level = Int(CGWindowLevelForKey(.StatusWindowLevelKey))
window.setAccessibilityHidden(true)
window.makeKeyAndOrderFront(nil)
NSApplication.sharedApplication().activateIgnoringOtherApps(true)

<强>夫特

//Create popover ...
[popover showRelativeToRect:popoverRect ofView:window.contentView preferredEdge:NSMaxYEdge];

为了在点击屏幕上的某个位置时关闭弹出窗口,必须添加一个全局事件监视器:

<强>目标C     //添加全局监视器以跟踪何时应关闭弹出窗口     if(self.monitor == nil){         self.monitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask | NSRightMouseDownMask | NSKeyUpMask)处理程序:^(NSEvent * event){             [NSEvent removeMonitor:self.monitor];             self.monitor = nil;             [self.popover close];             self.window = nil;         }];     }

<强>夫特

//Create popover ...
popover.showRelativeToRect(popoverRect, ofView: window.contentView, preferredEdge: .MaxY)