OS X:如何将鼠标拖动事件通过视图传递给超级视图
Posted
技术标签:
【中文标题】OS X:如何将鼠标拖动事件通过视图传递给超级视图【英文标题】:OS X: How to pass mouse drag events through a view to superview 【发布时间】:2016-09-16 21:40:45 【问题描述】:我正在使用 Swift for OS X 构建一个应用程序,我有一个 NSTabView
可以将图像拖入其中。对于每个拖入的图像,它会添加一个新选项卡,NSTabViewItem
包含一个 NSImageView
,其中包含被拖入的 NSImage
。
我创建了一个处理拖动操作的NSTabView
类的子类。
我的代码在它获取拖动的图像并正确创建新标签的地方工作。但是,一旦出现NSImageView
(拖入后),现在在拖动新图像时,似乎NSImageView
正在阻止拖动信息并且不接收拖动操作。因此,如果我将新图像放在显示先前拖动图像的NSImageView
的边缘,我只能拖动它们。
有没有办法让NSImageView
对鼠标拖动事件透明,以便它们传递到下面的NSTabView
?
我尝试将NSImageView.enabled
设置为false,并尝试覆盖NSImageView
的hitTest
。但这些似乎都不起作用。
【问题讨论】:
NSImageView
的editable
属性是否设置为false
? editable
: "一个布尔值,指示用户是否可以将新图像拖动到图像视图中。" developer.apple.com/library/mac/documentation/Cocoa/Reference/… 不确定这是否可行...
@NSGod NSImageView
是以编程方式创建的。我在创建后打印出editable
的值,它似乎默认设置为false
。
【参考方案1】:
您可以在NSView
上使用该功能
func unregisterDraggedTypes()
在您创建的 NSImageView
上,以防止他们吃掉粘贴板上的图像。
这应该允许底层NSTabView
子类接收拖动事件。
或者,如果这不起作用,则放置一个NSView
子类,它将在NSTabview
的顶部接收拖动事件并覆盖hitTest
,以便点击进入下面的视图。
override func hitTest(aPoint: NSPoint) -> NSView?
return nil
【讨论】:
以上是关于OS X:如何将鼠标拖动事件通过视图传递给超级视图的主要内容,如果未能解决你的问题,请参考以下文章