我有一个基于Cocoa,基于文档的Mac OS X应用程序。
我的应用程序中的一个功能是一系列文本项,可以双击进行编辑。当用户双击其中一个文本项时,我将当前窗口的fieldEditor
文本字段放在单击的文本项上以进行编辑。
除一个问题外,一切正常。我无法弄清楚如何使fieldEditor
文本字段剪辑 + 滚动而不是包裹为其文本。这是当前的样子:
看到文本如何换行到第二行?我不要我希望它保持滚动显示(并显示为已剪切)的一行。
这是一个示例,它可以在文本较少的列表项上正常工作:
这是我在 View Controller 中尝试的方法:
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:
方法中计算出的rect的高度是正确的,并且提供的rect大小适合单行文本(在这种情况下为14.0像素)。我缺少使
fieldEditor
显示一行滚动/剪切文本的功能吗?我也尝试在中间部分添加以下行:
[[tv textContainer] setHeightTracksTextView:YES];
[[tv textContainer] setWidthTracksTextView:YES];
这具有调整
fieldEditor
可见部分大小的预期效果,这是很好的。但坏消息是,它不会改变文本仍处于包装状态,而不是剪切+滚动的事实。 :(这似乎与此常量有关:
NSStringDrawingUsesLineFragmentOrigin
可以在以下的
options:
参数中使用:-[NSAttributedString drawWithRect:options:attributes:]
但就我而言,我使用的是
NSText
字段编辑器,而不是NSAttributedString
。我不知道如何使用NSText
字段编辑器来执行此类操作。 最佳答案
嗯... NSTextView的滚动行为完全依赖于NSScrollView。我不确定是否还有更多我看不到的东西,但是看来您问题的“历史性”解决方案是:
使用其他控件
您可以在其标准IB标签配置中使用可编辑的NSTextField,并启用编辑功能并选择滚 Action 为行为。正确配置后,它已经为您完成了所有繁重的工作-无需直接与字段编辑器打交道。
...或者...
作弊
将字段编辑器动态地放入适当大小和配置的NSScrollView中(仅允许水平滚动;不显示滚动条),然后在完成编辑后删除滚动 View 。