macoscocoanswindownsviewcontrollernspopover

NSPopOver & NSViewController - Drag to resize


I am making a MenuBar app for which I am using NSPopOver. The problem is that NSPopover uses NSViewController as a contentViewController, whose size gets fixed. My requirement is to make the size of NSViewController flexible i.e just like NSWindowController(set the minimum size and maximum depends upon the total screen size). In simple words how to change the size of NSViewController(NSPopOver) when user drags it. I am new to OS X programming.


Solution

  • I finally got it working by using Mouse Events. Just need to monitor the

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

    events, and reset the content size of the popOver. Hope this would be helpful to someone one day.

    EDIT

    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)
    
        }
    

    This is how i tracked the mouse event. On Mouse drag just calculated the current position and the new position(To the point where user has dragged), then checked if the point is smaller then my default size for the Popover i.e. (450, 650) in this case. Once the point has been calculated, just set the size of the popover.

    This is just a proposed way. There must be something better then this, but for time being this is what I did.