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

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

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

ROW1 ===============
|图片|一些名字|
|图片|闲置|
2行================
|图片|一些名字真的很长的名字| < - 这被包裹起来推动'空闲'离开视图
|图片|闲置|
===================

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

解决方法

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

截断而不是包裹

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

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

一个例子:

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

细胞扩张框架

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

Cell expansion can occur when the mouse hovers over the specified cell and the cell contents are unable to be fully displayed within the cell.

如果它们由于某种原因而无法正常工作并且您正在使用自定义NSCell子类,请确保在您的单元格中实现-drawWithExpansionFrame:inView:和-expansionFrameWithFrame:inView :.还要确保在NSTableViewDelegate中没有为-tableView返回NO:shouldShowCellExpansionForTableColumn:row :(如果有的话).

调整整个表视图的宽度?

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

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...