如何使用NSAttributedString保持文本不被包装在NSTableView中

时间:2010-05-24 22:28:28

标签: objective-c cocoa

我有一个NSTableView有2列,一列用于图标,另一列用于两行文本。在第二列的文本列中,我有一些较大的文本,用于表示项目的名称。然后我有一个新行和一些描述项目状态的小文本。

当名称变得如此之大以至于它不适合它包裹的一行时(或当你将窗口缩小到如此之小以至于它导致名称不适合单行时)。

ROW1 ===============
|图片|一些名字|
|图片|闲置|
2行================
|图片|一些名字真的很长的名字| < - 这被包裹从视图中推出'空闲' |图片|闲置|
===================

我的问题是,如果名称太大而不适合,我怎么能保持文本不被包装,只让NSTableView显示水平滚动条?

1 个答案:

答案 0 :(得分:11)

使用NSScrollView实现Cocoa滚动,这是一个视图而不是单元,所以如果你真的想为表视图单元实现水平滚动我认为你必须继承整个NSTableView并在那里实现这个功能。我的建议(当然不知道你的情况的具体情况)是你不这样做,因为它是非标准行为,并且可能需要相当多的工作。

截断而不是包裹

如果您使用的是标准NSTextFieldCell,只需在IB中选择“截断”作为其布局值,而不是“Wraps”。

如果你有一个自定义NSCell你正在做你自己的绘图(我假设这是这里的情况),你应该创建一个NSParagraphStyle,设置其换行模式,添加为NSParagraphStyleAttributeName文本属性字典中NSAttributedString键的值。

一个例子:

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

细胞扩增框架

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

  

当鼠标悬停在指定的细胞上并且细胞内容无法在细胞内完全显示时,可能会发生细胞扩增。

如果由于某种原因他们无法使用自定义NSCell子类,请确保在您的单元格中实施-drawWithExpansionFrame:inView:-expansionFrameWithFrame:inView:。另外,请确保您NO NSTableViewDelegate中没有-tableView:shouldShowCellExpansionForTableColumn:row:返回NSTableViewDelegate(如果有的话)。

调整整个表视图的宽度?

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