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

bru*_*lla 14 cocoa

弹出窗口大量用于iPad应用程序,我真的很喜欢它们.现在我想一想如何在Mac上的AppKit中实现它,因为我有一个用例.

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

Sam*_*cer 20

根据Apple的开发人员文档,您可以使用内置的NSPopover类在OS X上使用内置的弹出窗口:

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

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

在Mac OS X中使用NSPopover


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

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

    @property (assign) IBOutlet NSPopover *popover;
    - (IBAction)showPopover:(id)sender;
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    [[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxYEdge];
    
    Run Code Online (Sandbox Code Playgroud)

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

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


编辑

正如大卫在评论中指出的那样:

解雇popover的另一种可能性是将其行为设置为Transient.这允许用户单击弹出窗口外的任何位置以使其消失

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

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

Apple的文档中阅读更多相关信息.

  • +1很棒的答案 - 很好的编辑.解除弹出窗口的另一种可能性是将其设置为瞬态行为.这允许用户单击弹出窗口外的任何位置以使其消失.ps记住要建立2个连接(插座和动作). (2认同)

小智 12

如果我理解正确,你需要像MAAttachedWindow(Matt Gemmell)这样的东西,它是开源的.

MAAttachedWindow