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,并尝试覆盖NSImageViewhitTest。但这些似乎都不起作用。

【问题讨论】:

NSImageVieweditable 属性是否设置为falseeditable: "一个布尔值,指示用户是否可以将新图像拖动到图像视图中。" 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:如何将鼠标拖动事件通过视图传递给超级视图的主要内容,如果未能解决你的问题,请参考以下文章

仅当触摸类型为手指时,如何将触摸事件传递给其他视图?

如何将 settings.py 中的变量传递给视图?

通过拖动元素传递 mouseover 事件

如何通过拖动在SwiftUI ZStack中重新排列视图

即使光标移出影片后仍继续跟踪鼠标拖动事件

避免将触摸事件传递给后面的背景视图