我有一个基于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 。

10-04 13:07