【问题标题】:NSEvents pass through NSView when overlapping anotherNSEvents 在重叠另一个时通过 NSView
【发布时间】:2014-09-15 17:24:56
【问题描述】:

在我的自定义 NSWindow 类中,我有一个父视图(设置为窗口的 contentView)和一个子视图。在我的整个应用程序中,我将子视图附加到我的子视图中,这些子视图似乎都完美地接收了 mouseDown 响应。但是,我希望在单击按钮时将面板滑入子视图上方(但仍位于父视图中)(我在我的应用程序中将其称为slidingOverlay)。在将slidingOverlay 子视图(随后包含更多子视图)添加到子视图后,我无法单击它的任何元素,因为它们都传递到较低的子视图。

几个细节:

  • 我尝试将slidingOverlay 叠加为子视图和父视图的子视图,这都会导致子视图接收NSEvents。
  • slidingOverlay 看起来是不透明的(半透明的?不确定 Apple 是否有一个术语),尽管它清晰可见、有图层支持并且具有纯色。也许这就是起源?我对 Cocoa 比较陌生。
  • 所有三个视图实际上都是层支持的(Parent、Child 和slidingOverlay)。
  • 所有三个视图都是以编程方式创建的。
  • 我已经尝试覆盖 (NSView*)hitTest:(NSPoint)aPoint for Child,并将 NSEvent 转发到slidingOverlay 的子视图有效。但是,这种方法看起来有点像 hack,需要我预先确定哪个slidingOverlay 子视图将接收事件。我希望所有slidingOverlay 子视图都能够获得点击,忽略所有较低的子视图,而slidingOverlay 是可见的。

总结一下,有一个 NSWindow,其 contentView 为 Parent。父级有一个子视图(NSButtons、下拉菜单、自定义类等),所有子视图都接收点击。当前状态下的滑动叠加层作为子视图附加到子视图(根据我对事物的掌握,它应该可以正常工作),并且可以切换其可见性。当在 mouseDown NSEvents 上切换到slidingOverlay 时,其子项被传递到 Child 的底层子视图 - 例如,单击点 100,400 将导致下拉(Child 的直接子视图,但在可见的slidingOverlay 层下方)被展开。

我想问题是 - 当一个 NSView(包含子视图)位于另一个视图之上时,它如何被视为“实体”和可点击,有利于它的父视图或底层视图?

【问题讨论】:

    标签: objective-c cocoa calayer nsview nswindow


    【解决方案1】:

    看起来像附加一个新的 NSWindow(替换slidingOverlay)作品(有利于进一步分层 Child)。仍然不知道为什么 NSEvents 在附加了一定数量的子视图后会穿透,虽然......

    【讨论】:

      【解决方案2】:

      这与子视图在其数组中的位置有关。

      每当子视图重叠时,稍后添加的子视图将接受鼠标事件。支持层的视图中的zPosition 也无济于事。 您可以通过使用以下方法对子视图进行排序来解决此问题:

      - (void)sortSubviewsUsingFunction:context:
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 2016-05-17
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        相关资源
        最近更新 更多