Popovers大量用于iPad应用程序,我非常喜欢它们。现在我想一想如何在Mac上的AppKit中实现它,因为我有一个用例。
我是否需要NSWindow子类来完成叠加?还是我还可以使用普通视图?
答案 0 :(得分:19)
根据Apple's Developer Documentation,你可以使用内置的NSPopover类在OS X上使用内置的弹出窗口:
从OS X v10.7开始,AppKit通过NSPopover类为弹出窗口提供支持。弹出框提供了一种在屏幕上显示与现有内容相关的附加内容的方法。包含出现弹出窗口的现有内容的视图在此上下文中称为定位视图。您可以使用锚点来表示弹出窗口与其定位视图之间的关系。
以下是NSPopover class的链接。您还可以看到日历(10.7+)应用程序和Safari应用程序(10.8+)中使用的NSPopovers示例。下图描绘了日历应用程序(左)和Safari(右)中的弹出窗口:
以下是如何设置NSPopover,它非常简单,主要可以在界面构建器中完成。
在头文件(.h)中添加以下两行代码:
@property (assign) IBOutlet NSPopover *popover;
- (IBAction)showPopover:(id)sender;
不要忘记将插座和操作连接到您的界面。
showPopover
在showPopover
方法中,添加此行以显示popover:
[[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxYEdge];
由你决定如何解雇popover;因为复制/粘贴有什么乐趣?您可以手动执行此操作(提示:尝试使用close
)或更改behavior
属性并让系统执行此操作(请参阅下面的编辑)。
修改
正如David in his comment所述:
解除弹出窗口的另一种可能性是将其行为设置为瞬态。这允许用户单击弹出窗口外的任何位置使其消失
弹出框的行为属性设置它的显示和消失方式。有三种行为:
NSPopoverBehaviorApplicationDefined
- (默认)您的应用必须关闭弹出窗口NSPopoverBehaviorTransient
- 当任何界面元素与popover外部进行交互时,popover会关闭NSPopoverBehaviorSemitransient
- 当弹出框的呈现视图中的任何界面元素与弹出窗口外部进行交互时,弹出窗口将关闭。在Apple's Documentation了解详情。
答案 1 :(得分:12)
如果我理解正确,你需要MAAttachedWindow(由Matt Gemmell编写),这是开源的。
答案 2 :(得分:3)
或者,您可以查看文档中的Popover
示例。 https://developer.apple.com/library/mac/samplecode/Popover/Introduction/Intro.html