Перетащите и измените размер моего NSPopover в приложении строки меню (быстро)

Мне нужно изменить размер NSPopver в приложении строки меню. Вот мой подход:

override func mouseDragged(with event: NSEvent) {
    let appDelegate : AppDelegate = NSApplication.shared().delegate as! AppDelegate
    let originSize = appDelegate.popover.contentSize

    let currentLocation = NSWindow().mouseLocationOutsideOfEventStream

    let delta_x = NSWindow().mouseLocationOutsideOfEventStream.x - currentLocation.x
    let delta_y = NSWindow().mouseLocationOutsideOfEventStream.y - currentLocation.y

    let newWidth = originSize.width + delta_x
    let newHeight = originSize.height + delta_y

    appDelegate.popover.contentSize = NSSize(width: newWidth, height: newHeight)
}

Проблемы:

  1. действие изменения размера NSPopover не может выполняться точно.
  2. Я хочу, чтобы курсор менялся на стрелку, когда курсор наводится на границу NSPopover, как я могу этого добиться?

РЕДАКТИРОВАТЬ:

Я попробовал решение NSPopOver и NSViewController - перетащите для изменения размера:

вот эффект

и вот код, который преобразуется в версию swift3:

override func mouseDragged(with event: NSEvent) {
    var currentLocation = NSEvent.mouseLocation()

    var newOrigin   = currentLocation
    let screenFrame = NSScreen.main()?.frame

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

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

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


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

}

Это то, чего я ожидаю достичь


person 何子龙    schedule 08.10.2017    source источник
comment
Возможный дубликат NSPopOver и NSViewController — перетащите, чтобы изменить размер   -  person Ssswift    schedule 08.10.2017
comment
Я пробовал его решение, но оно не сработало, не могли бы вы мне помочь?   -  person 何子龙    schedule 09.10.2017
comment
Можете ли вы описать, как именно это не работает, или чем ваша ситуация отличается от этой?   -  person Ssswift    schedule 09.10.2017
comment
привет, я отредактировал свою проблему, дайте мне совет, пожалуйста.   -  person 何子龙    schedule 10.10.2017


Ответы (2)


PopoverResize, который позволяет пользователю изменять размер строки меню NSPopover. Он также включает курсоры для краев.

https://github.com/dboydor/PopoverResize

person David Boyd    schedule 29.10.2018

Это работает для меня:

override func mouseDragged(with event: NSEvent) {
    guard let appDelegate: AppDelegate = NSApplication.shared.delegate as? AppDelegate else { return }
    var size = appDelegate.statusItemManager.popover?.contentSize ?? CGSize.zero
    size.width += event.deltaX
    size.height += event.deltaY
    // Update popover size depend on your reference
    appDelegate.popover?.contentSize = size 
}
person anatoliy_v    schedule 27.03.2021
comment
Я новичок в Swift, это происходит внутри делегата приложения? - person dreambug; 14.05.2021