【发布时间】: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