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

如何使用nsattributedstring防止文本在不稳定视图中换行

  •  5
  • Justin  · 技术社区  · 16 年前

    我有一个不可安装的视图,它有两列,一列代表图标,另一列代表两行文本。在第二列,即“文本”列中,我有一些较大的文本,用于项的名称。然后我有了一行新行和一些描述项目状态的小文本。

    当名称变得如此大以致于不能放在一行上时,它会自动换行(或者当您将窗口缩小到如此小以致于使名称不能放在一行上时)。

    第1行=========
    |图像某个名称|
    图像闲置
    第2行==========
    | image some name really long name<-将“idle”从视图中推出时,它会被包装起来。
    图像闲置
    ==========='

    我的问题是,当名称太大而无法容纳时,如何才能防止文本换行,并让InstableView显示一个水平滚动条?

    1 回复  |  直到 16 年前
        1
  •  11
  •   hasseg    16 年前

    Cocoa中的滚动使用 NSScrollView 哪个是 看法 而不是 细胞 因此,如果您真的想为表视图单元格实现水平滚动,我认为您必须将整个子类化 NSTableView 在那里实现这个特性。我的建议(当然不知道你的具体情况)是你不这样做,因为 非标准行为 可能需要做很多工作。

    截断而不是换行

    如果你用的是标准 NSTextFieldCell ,只需为其选择“截断” 布局 以ib表示而不是“wrapps”。

    如果你有一个习惯 NSCell 如果您正在绘制自己的图形(我假设这里是这种情况),则应创建一个 NSParagraphStyle ,设置其换行模式,将其作为 NSParagraphStyleAttributeName 关键在 NSAttributedString 的文本属性字典。

    一个例子:

    NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle alloc] init] autorelease];
    [paragraphStyle setLineBreakMode:NSLineBreakByTruncatingTail];
    [attributedStr
     addAttribute:NSParagraphStyleAttributeName
     value:paragraphStyle
     range:NSMakeRange(0,[attributedStr length])];
    

    单元扩展框架

    如果不想在表格视图单元格中换行,则允许用户查看整个文本的标准方法是使用 单元扩展帧 默认启用:

    当鼠标悬停在指定单元格上并且单元格内容无法在单元格中完全显示时,可能会发生单元格扩展。

    如果他们因为某种原因不工作而你使用的是 恩塞尔 子类,确保实现 -drawWithExpansionFrame:inView: -expansionFrameWithFrame:inView: 在你的牢房里。还要确保你不会回来 NO 在你 NSTableViewDelegate 对于 -tableView:shouldShowCellExpansionForTableColumn:row: (如果你有)。

    调整整个表格视图的宽度?

    如果您要做的是调整特定列的宽度(从而调整整个表视图,可能导致封闭滚动视图的水平滚动条出现),使其单元格中包含的文本永远不会被截断或换行,则可以在 可安装视图委托 例如,通过调用 -cellSize 对于该列中每一行的单元格,并将该列的大小调整为最大值(当然,您只希望在值更改时执行此操作)。