NSTableView内容视图插入

时间:2010-10-30 11:51:19

标签: cocoa

我希望插入NSTableView的内容,以便在表格视图的顶部和第一个单元格之间存在间隙。

在iOS上,使用UITableView很容易 - 通过使用setContentInset:。

实现

4 个答案:

答案 0 :(得分:1)

重新打开标题并用您自己的子类替换标题视图。覆盖其-drawRect:仅绘制背景颜色。还要覆盖-headerRectOfColumn:以防止绘制任何列标题。我不确定这是否会阻止列拖动或排序,但我敢打赌它会这样做。

答案 1 :(得分:0)

它不是很干净,但你可以通过让第一排高于其余部分来实现这一点。实现heightOfRow表委托方法:

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row 
{
  if (row == 0) {
    return normalRowHeight + topPadding;
  } else {
    return normalRowHeight;
  }
}

缺点是您还需要实现自定义突出显示和自定义单元格绘制,以考虑第一行的额外空间。

答案 2 :(得分:0)

该问题询问如何调整类似于iOS的内容插图。当前选择的答案显示了如何将第一行向下移动,但这不是完全一样的。像iOS一样,调整内容插图也会将滚动条的起点移动到插图位置。将内容放在“生动的”或透明工具栏下面时,这很有用。

NSTableView本身没有内容插图。在macOS上,内容插入通常是NSScrollView的一部分。要访问NSTableView的视图控制器的滚动视图,可以使用enclosingScrollview method of NSView,禁用自动调整并按如下所示设置插图:

(在这里警告旧​​学校Obj-C)

    self.enclosingScrollView.automaticallyAdjustsContentInsets = NO;
    self.enclosingScrollView.contentInsets = NSEdgeInsetsMake(50.f,0.f,0.f,0.f);

通常可以从viewDidLoad调用它们,但是某些类型的表视图将使用它们自己的值覆盖。

设置为源列表模式的NSOutlineView带有许多默认值,这些默认值被覆盖以使视图看起来像Finder边栏。 没有“干净”的方法来设置这些视图的内容插入。它们固执地覆盖了您的值,我发现,如果您将NSOutlineView子类化并重载setFrameSize:,它将可以解决问题。像这样(在NSOutlineView子类内部):

- (void)setFrameSize:(NSSize)newSize {
    [super setFrameSize:newSize];
    self.enclosingScrollView.automaticallyAdjustsContentInsets = NO;
    self.enclosingScrollView.contentInsets = NSEdgeInsetsMake(100.f,0.f,0.f,0.f);
}

这可以解决问题,但是初始滚动位置会很奇怪。从子类的initWithCoder:方法调用scrollToBeginningOfDocument:会将其滚动到正确的初始位置。

答案 3 :(得分:-1)

scrollView.automaticallyAdjustsContentInsets = false
scrollView.contentInsets = NSEdgeInsets(top: 40, left: 0, bottom: 0, right: 0)