【问题标题】:Automatically adjust size of NSTableView自动调整 NSTableView 的大小
【发布时间】:2012-11-06 20:32:03
【问题描述】:

我有一个 NSTableView,它应该在添加一行时调整它的框架。 我会创建 2 个属性,maxHeight 和 minHeight,如果要添加或删除任何行,我会调整表格视图的大小以适应它的内容,如果它没有超过限制。

类似于 Safari 下载面板(10.7 或更高版本)。 有谁知道如何做到这一点? 我想在一个子类中处理这个。所以不要在委托类中调整大小。

我至少需要知道在重新加载表视图时调用了哪个方法。 reloadTable 只调用了真正的重载方法,所以没有成功。

【问题讨论】:

标签: objective-c xcode macos cocoa nstableview


【解决方案1】:

不久前我做了类似的事情,我是在控制器上做的,而不是在子类上做的(对不起,如果它不是你要找的东西)。基本上我写了一个方法,通过添加所有行的高度来计算 tableview 的高度。每次我从表中添加或删除一行时,我都会调用该方法。下面是一些可以帮助您入门的内容:

- (void)adjustTableSize
{
    NSInteger minHeight = ...
    NSInteger maxHeight = ...

    NSInteger tViewHeight = 0;
    for (int i = 0; i < [tableView numberOfRows]; i++) {
        NSView* v = [tableView viewAtColumn: 0 row: i makeIfNecessary: YES]; // Note that this is for view-based tableviews
        tViewHeight += v.frame.size.height;
    }

    NSInteger result = MIN(MAX(tViewHeight, minHeight), maxHeight);

    // Do something with result here
}

如果您真的希望在子类中使用它应该是可能的,但要弄清楚如何...

编辑:

如果您不介意使用未记录的 API,这里有一个更简单的版本:

- (void)adjustTableSize
{
    NSInteger minHeight = ...
    NSInteger maxHeight = ...
    NSInteger result = MIN(MAX([tableView _minimumFrameSize].height, minHeight), maxHeight);

    // Do something with result here
}

由于这是未记录的,我不能保证它会起作用,但从我目前的测试来看,它确实有效。 并且可能比仅仅为了获得它们的高度而创建视图要快,特别是如果你有很多行。

【讨论】:

  • 这很酷,唯一需要调整的就是在 NSTableView 子类中找到正确的方法。正如您在上面的类转储中所见,有很多。您知道要使用哪一个吗?
  • 哦,顺便说一句。你可以只使用 enumerateAvailableRowViewsUsingBlock:
  • 好吧,我玩了一点,它的 bug 很多。 NSScrollView的frame你设置了吗?
  • 是的,enumerateAvailableRowViewsUsingBlock 是对的。不,我真的不知道。但是......也许你可以继承realoadData,首先调用super然后这样做(?)不,我添加了一些填充并将框架直接设置到包含tableview的窗口,这意味着table view间接调整大小。不要忘记,如果您直接更改 tableview 的框架,您可能会弄乱包含它的滚动视图(这就是为什么我认为在控制器上这样做可能会更好......)。但我也没有对滚动视图做任何事情。
  • 再想一想,我认为 enumerateAvailableRowVjewUsingBlock: 可能不是我们想要的。该方法包括当前可见的所有视图,由 tableview 动画或存储。无法保证您将获得的视图数与行数相同。如果您使用此方法并且遇到问题,请尝试 for 循环。
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
相关资源
最近更新 更多