NSPopOver & NSViewController - перетащите, чтобы изменить размер

Я делаю приложение MenuBar, для которого я использую NSPopOver, Проблема в том, что NSPopover uses NSViewController as a contentViewController, чей размер фиксируется. Мое требование состоит в том, чтобы сделать размер NSViewController гибким, т.е. NSWindowController(установите минимальный размер, а максимальный зависит от общего размера экрана). Простыми словами, как изменить размер NSViewController(NSPopOver), когда пользователь перетаскивает его. Я новичок в программировании OS X.

3 ответа

Решение

Я наконец получил это с помощью Mouse Events, Просто нужно следить за

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

события и сбросить размер содержимого 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) в этом случае. Как только точка была рассчитана, просто установите размер всплывающего окна.

Это просто предложенный способ. Должно быть что-то лучше, чем это, но на данный момент это то, что я сделал.

У меня была такая же потребность, и благодаря полезным комментариям выше, я создал PopoverResize. Это позволяет пользователю изменять размер меню NSPopover. Также включает курсоры для краев.

https://github.com/dboydor/PopoverResize

Вот ответ, который обрабатывает только вертикальное, но не горизонтальное изменение размера 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)

     }
Другие вопросы по тегам