我最近开始使用Swift来构建OS X应用程序,我想知道如何实现拖放区域。
更具体地说,我构建了一个处理图像的应用程序,但目前,用户必须手动输入输入图像的路径或使用文件选择器(这很烦人)。我想改进我的应用程序,允许用户通过简单的拖放输入图像(我只需要检索表示图像路径的String即可)。
我怎样才能做到这一点?
这是我在应用程序中使用的示例。
NSDraggingDestination
如有必要,将一致性添加到子类声明中(不需要,NSImageView
因为它已经符合协议)NSFilenamesPboardType
)registerForDraggedTypes
draggingEntered
,draggingUpdated
并performDragOperation
NSDragOperation
从这些方法返回draggingPasteboard
数组中获取文件路径在我的示例中,我添加了一个函数来检查文件扩展名是否在我们想要的扩展名之中。
迅捷2
class MyImageView: NSImageView {
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
// Declare and register an array of accepted types
registerForDraggedTypes([NSFilenamesPboardType, NSURLPboardType, NSPasteboardTypeTIFF])
}
let fileTypes = ["jpg", "jpeg", "bmp", "png", "gif"]
var fileTypeIsOk = false
var droppedFilePath: String?
override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation {
if checkExtension(sender) {
fileTypeIsOk = true
return .Copy
} else {
fileTypeIsOk = false
return .None
}
}
override func draggingUpdated(sender: NSDraggingInfo) -> NSDragOperation {
if fileTypeIsOk {
return .Copy
} else {
return .None
}
}
override func performDragOperation(sender: NSDraggingInfo) -> Bool {
if let board = sender.draggingPasteboard().propertyListForType("NSFilenamesPboardType") as? NSArray,
imagePath = board[0] as? String {
// THIS IS WERE YOU GET THE PATH FOR THE DROPPED FILE
droppedFilePath = imagePath
return true
}
return false
}
func checkExtension(drag: NSDraggingInfo) -> Bool {
if let board = drag.draggingPasteboard().propertyListForType("NSFilenamesPboardType") as? NSArray,
path = board[0] as? String {
let url = NSURL(fileURLWithPath: path)
if let fileExtension = url.pathExtension?.lowercaseString {
return fileTypes.contains(fileExtension)
}
}
return false
}
}
迅捷3
class MyImageView: NSImageView {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
// Declare and register an array of accepted types
register(forDraggedTypes: [NSFilenamesPboardType, NSURLPboardType, NSPasteboardTypeTIFF])
}
let fileTypes = ["jpg", "jpeg", "bmp", "png", "gif"]
var fileTypeIsOk = false
var droppedFilePath: String?
override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
if checkExtension(drag: sender) {
fileTypeIsOk = true
return .copy
} else {
fileTypeIsOk = false
return []
}
}
override func draggingUpdated(_ sender: NSDraggingInfo) -> NSDragOperation {
if fileTypeIsOk {
return .copy
} else {
return []
}
}
override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
if let board = sender.draggingPasteboard().propertyList(forType: "NSFilenamesPboardType") as? NSArray,
imagePath = board[0] as? String {
// THIS IS WERE YOU GET THE PATH FOR THE DROPPED FILE
droppedFilePath = imagePath
return true
}
return false
}
func checkExtension(drag: NSDraggingInfo) -> Bool {
if let board = drag.draggingPasteboard().propertyList(forType: "NSFilenamesPboardType") as? NSArray,
path = board[0] as? String {
let url = NSURL(fileURLWithPath: path)
if let fileExtension = url.pathExtension?.lowercased() {
return fileTypes.contains(fileExtension)
}
}
return false
}
}
问题内容: 我想做的就是能够在屏幕上拖放精灵。我尝试了以下代码: 该代码确实起作用,但是,当我快速拖动球时,我猜它检测到“球”不再包含点“位置”并且球停止了,这意味着我又将球捡起了。我希望球能够快速响应我的触摸,从而使球不会停止移动。我该怎么做? 问题答案: 我有一个实现,其中我将UIImageView子类化,并将其称为“ DraggableImage”
本文向大家介绍javascript实现拖放效果,包括了javascript实现拖放效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享的是一个拖放的效果,参考的代码,重构以下,加以理解学习。 首先来看效果: 拖动div 拖放状态:未开始 【程序说明】 拖动原理:其实就是在拖动块上监听mousedown事件,鼠标点击时,通过事件对象获取对应的坐标参数。然后鼠标移动时再监听d
我正在做的是为一副牌中的每张牌创建一个图像视图。对于每个图像视图,我添加了两个事件setOnDragOver和setondragdroped。然而,当我点击并试图拖动一张卡片时,我的活动打印声明甚至没有显示。 我试图做的是允许在窗格上拖动一张卡。因此,根据我拖动它的位置更改位置,但它仍然在窗口上。下面是图像视图的事件。 这个是为了脱线
我是JavaFX动画的新手。我正在尝试遵循代码作为另一个大项目的试用;基本上我想用鼠标拖动来移动圆圈,当圆圈在矩形上时,突出显示矩形。如果圆圈落在矩形上,请将其颜色更改为圆圈的颜色。 到目前为止,我已经设法用鼠标移动圆圈,但我不确定为什么矩形的OnDragEntered方法什么都不做。 以下是FXML: 这是控制器: 包装com.sc.colordx.controller; 这是正确的方法吗?还是
本文向大家介绍python3+PyQt5实现拖放功能,包括了python3+PyQt5实现拖放功能的使用技巧和注意事项,需要的朋友参考一下 本文是对《Python Qt GUI快速编程》的第10章的例子拖放用Python3+PyQt5进行改写,对图表列表,表格等进行相互拖放,基本原理雷同,均采用setAcceptDrops(True)和setDragEnabled(True)。 运行结果: 以上就
事情是这样的: 我被要求开发一个JAVA程序,该程序将对。tsv文件进行一些重组(移动单元格以进行某种换位)。 所以,我试着干干净净地做,现在得到了3个不同的包: 稍后将出现的另一个问题是,我不知道如何解析程序所需的参数。 不管怎样,谢谢你阅读这篇文章!