具有动态高度的 NSTableView

NSTableView with dynamic height

我正在 Xcode 6.1.1 OSX 10.10.2

如何让 table 调整其高度,使 table 的高度始终等于所有行的高度之和。

换句话说,它不应该显示任何空行。添加和删​​除行需要 NSTableView 自行调整大小。

一开始我想的是在增删行后使用下面的选择

[_tableViewHandle setFrameSize:(NSMakeSize(oldwidth, sumOfHeightOfAllRows)))]

但它看起来像一个 hack。

也可以仅使用 IB 来完成吗?

不知道是否可以仅使用 IB 来完成。在我的例子中,我使用自动布局约束并更改其 constant 值。

  1. 为父级 NSScrollView 添加高度限制(可能会禁用滚动)。
  2. 将约束连接到出口 属性。
  3. 在需要时使用 constant 值。

它应该可以将 table 视图约束到其具有顶部和底部约束的父视图(剪辑视图)。您不必手动调整高度或任何约束的 constant。它应该是自动的(table 视图将自行调整大小;这将强制剪辑视图足够大以包含 table 视图;这将强制滚动视图足够大以包含剪辑查看;等等)。

NSTableView 的实例与 UITableView 的实例不同。基本上 OS X 可滚动 table 视图是 NSScrollView 的实例,其中包含 NSTableView 的实例作为文档视图。

  • NSScrollView and NSClipView

These two classes aren’t part of the table view—nor are they required—but virtually all table views are displayed using the classes that make up the scroll view mechanism.

Apple Doc

此文档视图被滚动视图的剪辑视图(“文档区域”)剪辑,滚动视图是滚动视图本身的子视图。

Here 你对滚动视图层次有一个解释。

所以 table 视图本身是一个 non-scrolling 视图,其大小是根据其内容(行数)自动采用的 - 以及您想要和需要的一切。

因此有两种方法可以实现您的目标:

  • 在其层次结构之外“操作”table 视图:使用单个 table 视图而不使用其 parent 视图。当您将 table 视图放入 window 时,这 不是 您在 IB 中得到的结果。您必须手动执行此操作或在代码中构建 table 视图。

  • 将 parental 滚动视图的大小调整为具有自动布局的 table 视图。

我更喜欢第一种方法,因为我看不出有任何理由在 table 视图周围有一个带有剪辑视图的滚动视图,如果没有什么可以滚动和剪辑的话。但是,第二种方法也应该有效。

如果您有任何问题,只需将其添加为评论即可。

这是一个例子:

为了更好的解释,我做了一个视频

http://sendvid.com/0lu0tgda?secret=d7b751f9-a3e9-4cd1-9865-20884b0bd6c8

我把一个“Tableview”(也就是说,你从 IB 得到的,所以它是一个内部有 table 的滚动视图层次结构)放入 window 并放在左边边。我做了一些绑定以便轻松插入和删除。只是平常的东西。

然后我有一个方法,用它的 table 视图替换滚动视图:

- (IBAction)replaceView:(id)sender
{
  // Exchange the view
  NSView *contentView = self.scrollView.superview;
  NSTableView *tableView = self.tableView;

  [contentView addSubview:self.tableView];     // Isolate the table view and make it the new subview
  NSRect frame;
  frame.origin = self.scrollView.frame.origin; // Take the location from the scroll view
  frame.size = tableView.frame.size;           // Take the table views size
  tableView.frame = frame;
  [self.scrollView removeFromSuperview];       // Remove the meaningless scroll view
 
  // Size the window to the table view
  NSWindow *window = contentView.window;
  NSRect contentFrame = contentView.frame;
  contentFrame.size.height = frame.size.height;
  NSRect windowFrame = window.frame;
  windowFrame.size.height = [window frameRectForContentRect:contentFrame].size.height;
  [window setFrame:windowFrame display:YES];
   
  // Set constraints to make the window resizing, when table view resizes
  [contentView addConstraints:
  [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tableView]|" options:0 metrics:nil  views:NSDictionaryOfVariableBindings(tableView)]];
}

是的,你可以在很多方面美化它。但是,它只是为了演示您必须做什么以及使用哪些工具。