NSPopOver & NSViewController - 拖动调整大小

NSPopOver & NSViewController - Drag to resize

我正在制作一个我正在使用的 MenuBar 应用 NSPopOver。问题是 NSPopover uses NSViewController as a contentViewController,其大小已固定。我的要求是使 NSViewController 的大小灵活,即就像 NSWindowController(设置最小大小和最大值取决于总屏幕大小)。简单来说,如何在用户拖动时更改 NSViewController(NSPopOver) 的大小。我是 OS X 编程的新手。

我终于使用 Mouse Events 让它工作了。只需要监控

override func mouseDown(theEvent: NSEvent) {}
override func mouseDragged(theEvent: NSEvent) {}

events,并重置popOver的内容大小。 希望有一天这会对某人有所帮助。

编辑

override func mouseDragged(theEvent: NSEvent) {
        var currentLocation = NSEvent.mouseLocation()
        println("Dragged at : \(currentLocation)")

        var newOrigin   = currentLocation
        let screenFrame = NSScreen.mainScreen()?.frame
        var windowFrame = self.view.window?.frame

        newOrigin.x     = screenFrame!.size.width - currentLocation.x
        newOrigin.y     = screenFrame!.size.height - currentLocation.y

        println("the New Origin Points : \(newOrigin)")

        // Don't let window get dragged up under the menu bar
        if newOrigin.x < 450 {
            newOrigin.x = 450
        }

        if newOrigin.y < 650 {
            newOrigin.y = 650
        }

        println("the New Origin Points : \(newOrigin)")

        let appDelegate : AppDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.popover.contentSize = NSSize(width: newOrigin.x, height: newOrigin.y)

    }

这就是我跟踪鼠标事件的方式。在鼠标拖动时,只计算当前位置和新位置(到用户拖动的点),然后检查该点是否小于 Popover 的默认大小,即本例中的 (450, 650)。计算出点后,只需设置弹出框的大小即可。

这只是一个提议的方式。肯定有比这更好的东西,但暂时这就是我所做的。

这里是一个只处理垂直而不是水平调整 NSPopover 大小的答案。

    override func mouseDragged(with theEvent: NSEvent) {
        let currentLocation = NSEvent.mouseLocation()
        let screenFrame = NSScreen.main()?.frame

        var newY = screenFrame!.size.height - currentLocation.y

        if newY < MIN_HEIGHT {
            newY = MIN_HEIGHT
        }

        if newY > MAX_HEIGHT {
            newY = MAX_HEIGHT
        }

        let appDelegate : AppDelegate = NSApplication.shared().delegate as! AppDelegate
        appDelegate.popover.contentSize = NSSize(width: FIXED_WIDTH, height: newY)

     }

我有同样的需求,感谢上面的有用评论,我创建了 PopoverResize。这允许用户调整菜单栏 NSPopover 的大小。它还包括边缘游标。

https://github.com/dboydor/PopoverResize