5

我有一个 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我不知道如何用字段编辑器做这种事情。

4

3 回答 3

3

嗯... NSTextView完全依赖 NSScrollView来实现其滚动行为。我不确定是否还有更多我没有看到的内容,但看起来您的问题的“历史性”解决方案是:

使用不同的控件

您可以在其标准 IB 标签配置中使用可编辑的 NSTextField,启用编辑并选择滚动作为行为。如果配置正确,它已经为您完成了所有繁重的工作 - 无需直接使用字段编辑器。

...或者...

欺骗

将字段编辑器动态地放入适当大小和配置的 NSScrollView(只允许水平滚动;不显示滚动条),然后在完成编辑后移除滚动视图。

于 2012-04-05T22:52:42.357 回答
0
NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init];
[style setLineBreakMode:NSLineBreakByTruncatingHead];

NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init];
[attributes setObject:style forKey:NSParagraphStyleAttributeName];

NSTextView* textView = [[NSTextView alloc] init];
[textView setTypingAttributes:attributes];
于 2013-04-26T15:30:49.610 回答
0

如果您使用 NSTextView,请尝试以下代码....

[self.textView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
[self.textView setHorizontallyResizable:YES];
[[self.textView textContainer] setWidthTracksTextView:NO];
[[self.textView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];
于 2019-09-04T03:16:20.013 回答