NSSplitView有一种名为NSSplitViewDividerStyleThin的分隔器样式,它已经成为OS最新版本的规范。它只需绘制一条1像素宽的实线来表示分隔符。但是,分配器的实际跟踪区域大约为3-5像素宽,允许用户单击分配器两侧的一点开始拖动。
由于分割视图的子视图的布局使得它们实际上只有一个像素之间的距离,分割视图如何跟踪光标和鼠标向下的事件,以便能够拦截任何在分隔器的“框架”之外稍微发生的事件。通常,这些事件会传递到底层视图(就像滚动条与分隔器平齐)。
第一次思考:
该NSSplitView刚刚有一个3-5像素宽,透明的子视图的分隔器,被放置在其两个(或更多)的内容视图顶部。但是,如果我查询splitview有多少子视图,它只返回2。同样地,如果我使用类似于F-Script的方法进行检查。
在这个堆栈溢出问题中还讨论了重叠的同级视图不被AppKit真正支持的问题:
Is there a proper way to handle overlapping NSView siblings?
第二次思考:
也许NSSplitView只是使用一个NSTrackingArea作为分隔符,但是如果我询问它的跟踪区域的拆分视图,则不会返回任何一个。即使使用跟踪区域,父视图上的跟踪区域是否可以覆盖子视图上的跟踪区域?(例如,我假设子视图的滚动条优先,但在拆分视图中没有。)
第三思想:
也许NSSplitView使用的是某种覆盖在顶部的透明窗口,但是除非我找错了地方,否则我没有看到任何额外的窗口正在创建。
第四思想:
该NSSplitView使用本地事件监视器来跟踪所有鼠标移动和鼠标下移的事件,这些事件都是指定给应用程序的,并且拦截了拆分视图跟踪区域内的任何事件,即使从技术上讲,事件是在子视图上发生的。
那么,NSSplitView如何能够拦截位于为细边框绘制的视觉1像素宽空间之外的鼠标事件,而只发生在其一个子视图上?
发布于 2015-04-07 10:49:55
首先,NSSplitView似乎覆盖了-resetCursorRects,并在该方法中使用-addCursorRect:cursor:添加了游标rects。这就是它如何安排光标在其分隔符附近改变的方式。
第二,它覆盖了-hitTest:。鼠标事件由-[NSWindow sendEvent:]路由到视图。它使用-hitTest:来询问它的视图(例如,contentView和主题框架内容)哪个子代视图被击中。当它找到哪个视图被击中时,它会在该视图上调用-mouseDown: (或类似的,取决于确切的事件)。因此,视图可以防止将鼠标事件路由到其子视图。它可以从重写-hitTest:返回自己,即使点实际上在它的一个子视图中,并且鼠标事件将被传递给它,而不是子视图。
https://stackoverflow.com/questions/29487466
复制相似问题