gpt4 book ai didi

swift - 如何在 Cocoa 的 NSView 中移动 NSImageView?

转载 作者:搜寻专家 更新时间:2023-11-01 06:15:28 25 4
gpt4 key购买 nike

在我的 Mac OS 应用程序中,我需要一个功能,以便能够在 NSImageView 中发生 mouseDown 事件(由用户触发)后在 NSView 内部移动 NSImageView。当用户触发鼠标 Up 事件时,此 View 必须移动到最后一个 mouseDrag 事件方向并停留在那里。在移动过程中,我希望 NSImageView 在屏幕上可见(它应该与鼠标光标一起移动)。

我读过 Apple 的处理鼠标事件指南,https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html我还下载了这个示例代码:https://developer.apple.com/library/content/samplecode/DragItemAround/Introduction/Intro.html

两个链接都包含 Objective C 中的代码。DragItemAround 的代码已过时。我尝试在 GitHub 和其他 StackOverflow 线程上搜索解决方案,但没有找到任何有效的解决方案。

很高兴听到这个问题的答案。我正在使用 Swift 3。

我使用以下代码创建了一个自定义的 MovableImageView,它是 NSImageView 的子类:

import Cocoa

class MovableImageView: NSImageView {

override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)

// Drawing code here.
// setup the starting location of the
// draggable item

}

override func mouseDown(with event: NSEvent) {
Swift.print("mouseDown")

//let window = self.window!
//let startingPoint = event.locationInWindow


}


override func mouseDragged(with event: NSEvent) {
Swift.print("mouseDragged")

self.backgroundColor = NSColor.black

}

override func mouseUp(with event: NSEvent) {
Swift.print("mouseUp")
}

}

之后,在 Interface Builder 中,我将此类设置为 NSImageView。我还在 Interface Builder 中为此 NSImageView 设置了约束。

现在我想知道如何在 NSView 中移动 NSImageView? ( swift 3,XCode 8)

最佳答案

您需要保存 mouseDown 点,稍后用于偏移。请检查以下代码:

class MovableImageView: NSImageView {

var firstMouseDownPoint: NSPoint = NSZeroPoint

init() {
super.init(frame: NSZeroRect)
self.wantsLayer = true
self.layer?.backgroundColor = NSColor.red.cgColor
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)

// Drawing code here.
}

override func mouseDown(with event: NSEvent) {
Swift.print("mouseDown")
firstMouseDownPoint = (self.window?.contentView?.convert(event.locationInWindow, to: self))!
}

override func mouseDragged(with event: NSEvent) {
Swift.print("mouseDragged")
let newPoint = (self.window?.contentView?.convert(event.locationInWindow, to: self))!
let offset = NSPoint(x: newPoint.x - firstMouseDownPoint.x, y: newPoint.y - firstMouseDownPoint.y)
let origin = self.frame.origin
let size = self.frame.size
self.frame = NSRect(x: origin.x + offset.x, y: origin.y + offset.y, width: size.width, height: size.height)
}

override func mouseUp(with event: NSEvent) {
Swift.print("mouseUp")

}
}

在父 View 中,只需将此 MovableImageView 添加为 subview ,如下所示:

let view = MovableImageView()
view.frame = NSRect(x: 0, y: 0, width: 100, height: 100)
self.view.addSubview(view) //Self is your parent view

enter image description here

关于swift - 如何在 Cocoa 的 NSView 中移动 NSImageView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46097132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com