我们可以在Mac Cocoa应用程序中使用popovers吗?

时间:2011-01-05 21:04:21

标签: cocoa

Popovers大量用于iPad应用程序,我非常喜欢它们。现在我想一想如何在Mac上的AppKit中实现它,因为我有一个用例。

我是否需要NSWindow子类来完成叠加?还是我还可以使用普通视图?

3 个答案:

答案 0 :(得分:19)

根据Apple's Developer Documentation,你可以使用内置的NSPopover类在OS X上使用内置的弹出窗口:

  

从OS X v10.7开始,AppKit通过NSPopover类为弹出窗口提供支持。弹出框提供了一种在屏幕上显示与现有内容相关的附加内容的方法。包含出现弹出窗口的现有内容的视图在此上下文中称为定位视图。您可以使用锚点来表示弹出窗口与其定位视图之间的关系。

以下是NSPopover class的链接。您还可以看到日历(10.7+)应用程序和Safari应用程序(10.8+)中使用的NSPopovers示例。下图描绘了日历应用程序(左)和Safari(右)中的弹出窗口:

Use of NSPopover in Mac OS X


以下是如何设置NSPopover,它非常简单,主要可以在界面构建器中完成。

  1. 在界面构建器中将NSPopover项添加到XIB。这将创建NSPopover及其视图控制器。
  2. 接下来,通过界面构建​​器将自定义NSView拖到XIB中。这将是popover视图控制器的视图
  3. 使用popover中所需的任何控件自定义NSView
  4. 在头文件(.h)中添加以下两行代码:

    @property (assign) IBOutlet NSPopover *popover;
    - (IBAction)showPopover:(id)sender;
    

    不要忘记将插座和操作连接到您的界面。

  5. 在您的实现中,合成弹出窗口并添加showPopover
  6. 的方法
  7. showPopover方法中,添加此行以显示popover:

    [[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxYEdge];
    
  8. 由你决定如何解雇popover;因为复制/粘贴有什么乐趣?您可以手动执行此操作(提示:尝试使用close)或更改behavior属性并让系统执行此操作(请参阅下面的编辑)。

    祝你好运,希望这会有所帮助!


    修改

    正如David in his comment所述:

      

    解除弹出窗口的另一种可能性是将其行为设置为瞬态。这允许用户单击弹出窗口外的任何位置使其消失

    弹出框的行为属性设置它的显示和消失方式。有三种行为:

    • NSPopoverBehaviorApplicationDefined - (默认)您的应用必须关闭弹出窗口
    • NSPopoverBehaviorTransient - 当任何界面元素与popover外部进行交互时,popover会关闭
    • NSPopoverBehaviorSemitransient - 当弹出框的呈现视图中的任何界面元素与弹出窗口外部进行交互时,弹出窗口将关闭。

    Apple's Documentation了解详情。

答案 1 :(得分:12)

如果我理解正确,你需要MAAttachedWindow(由Matt Gemmell编写),这是开源的。

MAAttachedWindow

答案 2 :(得分:3)

或者,您可以查看文档中的Popover示例。 https://developer.apple.com/library/mac/samplecode/Popover/Introduction/Intro.html enter image description here