如何在Swift(OSX Mac应用程序)中使NSView可拖动?

时间:2016-07-06 13:34:54

标签: swift macos

我试图让两个NSView的可拖动,我想知道如何在Swift for OSX Mac应用程序中编写代码?我想在NSView中放置两个NSView,并使它们在NSView中可拖动。例如,创建NSViewA并嵌套在NSViewB和NSViewC中(两者都在NSViewA中可拖动)。我想在Swift中编写代码。干杯!

1 个答案:

答案 0 :(得分:-1)

如果您利用响应者链上传递的信息,您可以很容易地做到这一点。考虑这个自定义 NSView 类。

class DraggableView : NSView {
    var startPoint: NSPoint?
    var frameOrigin: NSPoint?
    
    override func mouseDown(with event: NSEvent) {
        startPoint = event.locationInWindow
        frameOrigin = frame.origin
    }
    
    override func mouseDragged(with event: NSEvent) {
        let offset = event.locationInWindow - startPoint!
        
        frame.origin = frameOrigin! + offset
    }
    
    override func mouseUp(with event: NSEvent) {
        startPoint = nil
        frameOrigin = nil
    }
}

为了使数学适用于 NSPoint,我在扩展中重载了运算符:

extension NSPoint {
    static func -(pointA: NSPoint, pointB: NSPoint) -> NSPoint {
        return NSPoint(x: pointA.x - pointB.x, y: pointA.y - pointB.y)
    }
    
    static func +(pointA: NSPoint, pointB: NSPoint) -> NSPoint {
        return NSPoint(x: pointA.x + pointB.x, y: pointA.y + pointB.y)
    }
}

那么你的 ViewController 类只是设置代码:

class ViewController: NSViewController {
    
    let viewA: DraggableView = DraggableView()
    let viewB: DraggableView = DraggableView()

    override func viewDidLoad() {
        super.viewDidLoad()

        viewA.frame = NSRect(origin: .zero, size: NSSize(width: 100, height: 100))
        viewB.frame = NSRect(origin: NSPoint(x: 125, y: 0), size: NSSize(width: 100, height: 100))
        
        viewA.wantsLayer = true
        viewB.wantsLayer = true
        
        viewA.layer?.backgroundColor = NSColor.blue.cgColor
        viewB.layer?.backgroundColor = NSColor.green.cgColor
        
        view.addSubview(viewA)
        view.addSubview(viewB)
    }
}