3

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

4

2 回答 2

1

我找到了一个不使用自动布局约束的解决方案。我正在使用 Rubymotion,所以我的解决方案是用 Ruby 编写的,但它可以很容易地用 Objective-C 进行翻译。

首先,当用户拖动左右子视图之间的分隔线时,为了只让左右子视图改变它们的大小,我创建了两个嵌套NSSplitView的,第二个到第一个的右侧部分。

问题中提到的最后一点,也就是说when the user drags the divider between the middle and the right subviews only these subviews change size是 an 的默认行为,NSSplitView所以这里无事可做。

最后,为了在用户调整窗口大小时只让最右边的子视图改变其大小,我实现了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

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

于 2013-09-19T13:46:00.373 回答
0

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

于 2013-09-19T13:52:14.493 回答