使用mail.app等三个子视图配置NSSplitView

时间:2013-07-09 07:01:08

标签: macos interface-builder nslayoutconstraint nssplitview

通过auto.app等自动布局约束配置带有3个子视图的splitview是可行的吗?我的意思是:当用户调整窗口大小时,最右边的子视图会改变它的大小,当用户拖动最左边和中间子视图之间的分隔符时,只有左右子视图会改变其大小,当用户拖动中间和子视图之间的分隔符时右侧子视图只有这些子视图会改变大小。 如果有可能怎么做。 我认为这个任务可能是由约束优先级执行的,但我对此感到困惑。 谢谢!

2 个答案:

答案 0 :(得分:0)

我找到了一个不使用自动布局约束的解决方案。我正在使用Rubymotion,所以我的解决方案是在Ruby中,但可以在Objective-C中轻松翻译。

首先,当用户拖动左侧和中间子视图之间的分隔符时,只获得左右子视图更改其大小,我创建了两个嵌套NSSplitView,第二个创建了右侧部分第一个。

问题中提到的最后一点,即when the user drags the divider between the middle and the right subviews only these subviews change sizeNSSplitView的默认行为,因此无需执行此操作。

最后,为了在用户调整窗口大小时仅让最右边的子视图更改其大小,我实现了splitView:resizeSubviewsWithOldSize:委托方法:

def splitView(splitView, resizeSubviewsWithOldSize:oldSize)
  sv1 = splitView.subviews[0]
  sv2 = splitView.subviews[1]

  leftFrame = sv1.frame
  rightFrame = sv2.frame
  newFrame = splitView.frame

  leftFrame.size.height = newFrame.size.height
  rightFrame.size.height = newFrame.size.height

  leftFrame.origin = NSMakePoint(0,0)
  ## 1 is the NSSplitView divider width
  rightFrame.size.width = newFrame.size.width - leftFrame.size.width -  1
  rightFrame.origin.x = leftFrame.size.width + 1

  sv1.setFrame(leftFrame)
  sv2.setFrame(rightFrame)
end

瞧! 我花了一段时间才使它工作,所以我希望它能为其他人节省一些时间。

答案 1 :(得分:0)

使用自动布局,您可以在NSSplitView中设置每个分隔符的保持优先级。 您可以使用委托方法在代码中或在Xcode中的界面构建器中执行此操作。