代码之家  ›  专栏  ›  技术社区  ›  sapi

如何在NSOutlineView中自动设置行高以适应文本?

  •  2
  • sapi  · 技术社区  · 11 年前

    TLDR:我想实现 this question (或任何其他相关方法) NSOutlineView .

    A. NSOutlineView(NS大纲视图) NSTableView 因为由于父/子关系,某些单元格可能相对于其他单元格缩进。

    我愿意使用任何方法,包括自动布局(如果可能)。我的观点很简单 NSTableCellView 只有 NSTextField .


    我需要能够在基于视图的视图中设置行的高度 NSOutlineView(NS大纲视图) 取决于该行的文本 NSText字段 .

    我目前正在使用以下(简化)代码,它利用了 NSString+Geometics 要计算给定宽度的视图的近似高度,请执行以下操作:

    - (CGFloat)outlineView:(NSOutlineView *)outlineView
         heightOfRowByItem:(id)item
    {
        static NSTableCellView *cell;
    
        if (!cell) {
            cell = [self.outlineView makeViewWithIdentifier:@"Cell"
                                                      owner:self];
        }
    
        NSString *text = [item text];
        float width = cell.textField.bounds.size.width;
    #warning this is completely wrong due to different levels of indentation
    
        float height = [text heightForWidth:width];
    
        return height;
    }
    

    这段代码背后的想法是保留一个临时单元格,以便使用其默认边界属性。这适用于顶层行。

    但是 NSOutlineView(NS大纲视图) 向右缩进。要计算 NSText字段 没错,我需要知道 NSText字段 在该压痕之后。

    我如何获取这些信息?


    我应该注意到不能打电话

    [outlineView viewAtColumn:0
                          row:[outlineView rowForItem:item]
              makeIfNecessary:YES]
    

    从内部 outlineView:heightOfRowByItem: ,这意味着无法获取对当前单元格的引用。

    1 回复  |  直到 8 年前
        1
  •  2
  •   pointum    11 年前

    使用 -[NSOutlineView indentationPerLevel] 以计算减小的子宽度。