【问题标题】:Can I use a custom view as a NSSplitView's divider?我可以使用自定义视图作为 NSSplitView 的分隔线吗?
【发布时间】:2016-11-16 22:35:29
【问题描述】:

我想使用更高 (27pt) 的视图作为垂直堆叠 (splitView.isVertical = false) 的 NSSplitView 的分隔线。 有没有预期的方法可以做到这一点?如果没有,是否有常见的黑客攻击?

我正在考虑使用细分隔线并在自定义视图中监听鼠标拖动,并使用它们以编程方式更改分隔线的位置。 这是一种有效的方法吗?

【问题讨论】:

  • 也许委托有一些方法可以做到这一点?你检查了吗?
  • @Willeke NSSplitViewDelegate 包含零个返回 NSView 或类似的函数
  • splitView(_:effectiveRect:forDrawnRect:ofDividerAt:)splitView(_:additionalEffectiveRectOfDividerAt:) 怎么样?
  • @Willeke 这些是矩形(我试过了,似乎只影响跟踪区域,而不是大小)。我想在那里放一个完整的视图。

标签: swift cocoa appkit nssplitview


【解决方案1】:

一种不需要监听鼠标拖动或任何主动更新视图的方法是使用自动布局:

1. 覆盖dividerThickness 以返回您的理想厚度。

2. 如果您的自定义视图不是不透明的并且您不希望默认的灰色显示通过,则覆盖 dividerColor 以返回 clear。

如果您的最低部署目标是 10.11 或更高版本:

3a. 在拆分视图上将arrangesAllSubviews 设置为NO,然后将自定义分隔视图添加为拆分视图的子视图。 (不将arrangesAllSubviews 设置为NO,添加自定义分隔线视图会将其添加为拆分窗格)

否则,如果您的最小部署目标为 arrangesAllSubviews 设置为 NO):

3b.添加您的自定义分隔线作为拆分视图容器的子视图,但要确保它在子视图/z 顺序中更高

4. 添加约束以将该视图定位到分隔线所在的位置,例如:

let constraints = [dividerView.topAnchor.constraint(equalTo: topPane.bottomAnchor),
                   dividerView.bottomAnchor.constraint(equalTo: topPane.bottomAnchor),
                   dividerView.leadingAnchor.constraint(equalTo: splitView.leadingAnchor),
                   dividerView.trailingAnchor.constraint(equalTo: splitView.trailingAnchor)]
NSLayoutConstraint.activate(constraints)

自动布局会在用户拖动时更新分隔视图的位置。

【讨论】:

  • 您好,您知道arrangesAllSubviews 是做什么的吗?我的应用程序在开启时崩溃,但关闭时我收到一个关闭的警告
猜你喜欢
  • 2017-04-15
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多