我有一个 Cocoa,基于文档的 Mac OS X 应用程序。
我的应用程序中的一个功能是可以双击进行编辑的文本项目列表。当用户双击其中一个文本项时,我将当前窗口的fieldEditor
文本字段放在单击的文本项上以允许编辑。
一切正常,除了一个问题。我无法弄清楚如何使fieldEditor
文本字段剪辑+滚动而不是包装其文本。这是它目前的样子:
看看文本是如何换行到第二行的?我不想要那个。我希望它保持一行滚动(并出现剪辑)。
这是一个在文本较少的列表项上正常工作的示例:
这是我在视图控制器中尝试的内容:
NSWindow *win = [listItemView window];
NSText *fieldEditor = [win fieldEditor:YES forObject:listItemView];
[fieldEditor setFont:[TDListItemView titleFont]];
[fieldEditor setAlignment:NSLeftTextAlignment];
[fieldEditor setDrawsBackground:YES];
[fieldEditor setBackgroundColor:[NSColor whiteColor]];
[fieldEditor setString:str];
[fieldEditor setDelegate:self];
[fieldEditor selectAll:nil];
if ([fieldEditor isKindOfClass:[NSTextView class]]) {
NSTextView *tv = (NSTextView *)fieldEditor;
NSMutableParagraphStyle *style = [[[tv defaultParagraphStyle] mutableCopy] autorelease];
[style setLineBreakMode:NSLineBreakByClipping];
[tv setDefaultParagraphStyle:style];
}
CGRect r = [self fieldEditorRectForBounds:[listItemView bounds] index:idx]; // height here is 10.0
[fieldEditor setFrame:r];
[fieldEditor setNeedsDisplay:YES];
[[self view] addSubview:fieldEditor];
[win makeFirstResponder:fieldEditor];
注意中间的那部分:我检查这fieldEditor
是否是一个实例,NSTextView
以便调用setDefaultParagraphStyle:
它的方法。这是我尝试fieldEditor
通过值来剪辑其文本NSLineBreakByClipping
。它没有任何效果。而且我什至不确定这是我应该做的让fieldEditor
滚动在一行上。
另请注意,我在我的-fieldEditorRectForBounds:index:
方法中计算的矩形的高度是正确的,并且提供了一个大小适合单行文本(在本例中为 14.0 像素)的矩形。
fieldEditor
为了使显示单行滚动/剪切文本,我缺少什么?
我还尝试在中间部分添加这些行:
[[tv textContainer] setHeightTracksTextView:YES];
[[tv textContainer] setWidthTracksTextView:YES];
这具有调整可见部分大小的预期效果,fieldEditor
这很好。但坏消息是它并没有改变文本仍然被包裹的事实,而不是被剪裁+滚动的事实。:(
这似乎与这个常数有关:
NSStringDrawingUsesLineFragmentOrigin
可用于以下options:
参数:
-[NSAttributedString drawWithRect:options:attributes:]
但就我而言,我使用的是NSText
字段编辑器,而不是NSAttributedString
. NSText
我不知道如何用字段编辑器做这种事情。