Popover 是一个新型的弹出窗口。
apple 文档里面这样说:
NSPopover类提供了一种方法在现有相关内容在屏幕上显示更多的内容。Popover窗口定位相对于现有内容。
锚点(anchor )是用来表示这两个单元的内容之间的关系。Popover窗口指定视觉特征出现,以及确定哪些用户交互行为将导致弹出窗口关闭。瞬态Popover窗口关闭以应对大多数的用户交互行为,而
而半瞬态Popover窗口关闭当用户与包含弹出窗口的定位视图的窗口。应用程序定义的Popover窗口的行为通常不由开发人员方面关闭。
系统相对于其定位视图自动定位每个popover窗口,popover窗口跟随其定位视图移动。定位视图内的一个定位矩形内可以指定额外的粒度。
popover窗口通过适当的delegate 方法实现拖动时,它可以分离成为一个独立的窗口。
我英语还不够好,就算借助翻译,也觉得很难懂。好在我们大致知道了。我们先不做任何说明,先实现一个例子,将一个这样的窗口显示出来,并做到控制它关闭。
首先建立一个cocoa 普通应用。
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
<pre name="code" class="plain" style="color: rgb(187, 44, 162); font-size: 11px; font-style: italic;">@IBOutlet weak var window: NSWindow!
func applicationDidFinishLaunching(aNotification: NSNotification) {
// Insert code here to initialize your application
}
func applicationWillTerminate(aNotification: NSNotification) {
// Insert code here to tear down your application
}
contentViewController
属性 -- 视图控制器管理popover的内容
现在我们需要提供一个ViewController,来给popover提供显示内容。要做到这一点,手下要建立一个NSViewController的子类,选择建立xib。你可以在这个xib里面添加一些内容,文本了,按钮拉等等。反正我们这次不打算用,你可以任意。
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var popover : NSPopover?
lazy var poverController : PopoverController? = {
return PopoverController(nibName: "PopoverController", bundle: nil)
}()
@IBOutlet weak var window: NSWindow!
我们打算点击一个按钮,然后让这个popover窗口弹出来,再点击一个按钮,让这个popover窗口关闭。所以我么要在mainmenu.xib里面添加两个按钮。并建立相应的action。代码如下。
@IBAction func ClosePopover(sender: AnyObject) {
popover?.performClose(self)
}
@IBAction func DisplayPopover(sender: AnyObject) {
if ( popover == nil ) {
popover = NSPopover()
self.window.contentView?.addSubview((poverController?.view)!)
popover!.contentViewController = poverController
let rc = NSMakeRect(40, 40, 100, 200)
popover!.showRelativeToRect(
rc, ofView: (poverController?.view)!, preferredEdge: NSRectEdge.MinY )
}
}
上面就是两个Action的代码。写这个文档之前,这些代码是测试过的,所以它能够工作。当你点击第一个按钮时候,会弹出popover窗口,点另一个时候popover窗口会消失。有点小问题,只能一次,第二次点击的时候,就没反应了。--嗯,但这不是问题。后面我还会继续研究,就这个话题继续下去,因为我可以确定这个东西会很有用。