【问题标题】:How to increase the height of NSTableHeaderView?如何增加 NSTableHeaderView 的高度?
【发布时间】:2012-01-23 13:32:08
【问题描述】:

我需要实现一个具有特定大小和渐变的headerview。我必须在headerview 的某些单元格中插入图像。尝试使用以下代码为headerview 创建单元格,但我无法自定义headerview

[[tableColumn headerCell] setImage:[NSImage imageNamed:@"sampleHeader"]];

如果我使用重写的 headerview 子类,我无法查看标题单元格中的图像或文本。请提供解决此问题的任何指示。

 

我可以通过继承NSTableHeaderCell 来插入图像和文本。如何增加NSTableHeaderView 的高度?


如果我同时继承 NSTableHeaderViewNSTableHeaderCell ,则无法查看 headercell.我使用以下代码设置 headerview 和 headercell

[tableView setHeaderView:CustomHeaderView];

[tableColumn setHeaderCell:[[[CustomHeaderTableCell alloc] initImageCell: [NSImage imageNamed:@"sample"]]autorelease]];

我遇到了与以下网址中给出的相同的问题

http://lists.apple.com/archives/cocoa-dev/2002/Jun/msg00331.html

【问题讨论】:

    标签: objective-c macos cocoa nstableview nstableheaderview


    【解决方案1】:

    以下链接帮助我解决了问题。

    http://lists.apple.com/archives/cocoa-dev/2003/Feb/msg00676.html

    您需要为NSClipViewNSTableHeaderViewCornerView 设置框架 这就是我在代码中实现相同的方式。

    for(NSView * subview in [topScrollView subviews])
    {           
       for(NSView * subSubView in [subview subviews])
       {
          if([[subSubView  className] isEqualToString:@"NSTableHeaderView"] &&  [[subview className] isEqualToString:@"NSClipView"]) 
          {
             [subSubView setFrameSize:NSMakeSize(subSubView.frame.size.width, subSubView.frame.size.height+5)];//HeaderView Frame
             [subview setFrameSize:NSMakeSize(subview.frame.size.width, subview.frame.size.height+5)];//ClipView Frame
          }
    
        }
        if ([[subview className] isEqualToString:@"_NSCornerView"])
        {
           [subview setFrameSize:NSMakeSize(subview.frame.size.width, subview.frame.size.height+5)]; //CornerView Frame
        }
    }
    

    【讨论】:

    • 我不确定 2011 年 appkit 中有哪些可用属性,但现在您当然不需要双 for 循环来获取表头视图、剪辑视图或角视图...
    【解决方案2】:

    你不需要继承 NSTableHeaderView。

    我能够在控制器类中使用以下 sn-p 更改标题视图的高度:

    -(void)awakeFromNib {
        NSRect frame = tableView.headerView.frame;
        frame.size.height = 26;
        tableView.headerView.frame = frame;
    }
    

    需要注意的是,滚动视图负责布局。它会根据需要自动更改 headerView 的框架,但保持高度不变。不需要按照其他答案中的建议调整剪辑视图等的大小。

    【讨论】:

    • 这并不能完全回答这种情况。在这个 sn-p 之后,我可以看到 NSTableHeaderView 确实变高了——但是列标题单元格是在原始标准高度绘制的,在它们上面留下了一个空白的表格宽度栏。因此,布局是自动的并不完全正确。也许您需要告诉其他人根据新的 TableHeaderView 大小重新布局列标题单元格。
    • 布局是自动的,但问题是 NSTableHeaderCell 以固定高度绘制其背景。你需要继承它并覆盖-drawWithFrame:inView:。最简单的实现是绘制一个渐变作为背景,然后调用-drawInteriorWithFrame:inView:
    • 但问题不仅仅在于背景!如果我在那里放置更多文本,并将单元格(NSTableHeaderCell)配置为换行 - 它不会换行。相反,我只看到第一行的开头。我担心没有为单元格提供正确(更高)的框架来绘制自身。否则 --- 为什么它没有正确绘制文本?
    • NSTableHeaderCell 不绘制换行文本。你需要继承它并覆盖-drawWithFrame:inView:
    • 这对我来说并不可靠,直到我使用[tableView tile]
    【解决方案3】:

    您还可以创建一个NSTableHeaderView 对象,使用框架(具有高度和宽度的矩形)对其进行初始化,并将该NSTableHeaderView 对象设置为您的表格视图。

     NSTableHeaderView *tableHeaderView = [[NSTableHeaderView alloc] initWithFrame:NSMakeRect(0, 0, 120, 60)];
        [myTableView setHeaderView:tableHeaderView];
    [tableHeaderView release];
    

    【讨论】:

      猜你喜欢
      • 2015-10-27
      • 2018-12-08
      • 2019-10-24
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多