使用选项卡时,在NSTextView中过早换行

时间:2013-01-11 12:22:38

标签: macos cocoa nstextview

如果输入一行标签,我在第51列之后的NSTextView换行时遇到一个奇怪的问题。这只发生在标签上,而不是任何其他字符,它们正确地包裹在文本视图的边缘,而不是在第51个字符之后。

这很容易重复。使用单个窗口和一个NSTextView在XCode中创建一个空白项目。唯一的非默认设置是我删除了约束,并使用旧样式自动调整大小来自动调整textview以填充窗口。我没有写过代码。现在运行应用程序,打开窗口,使其宽度超过51个字符,按住Tab键,它将提前换行。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这里的问题是NSTextView有一个默认的NSMutableParagraphStyle对象,它有一个属性列表,如换行,制表位,边距等等......你可以通过转到格式菜单,文本子视图,然后选择“显示标尺”菜单。 (您可以使用任何NSTextView免费获得此菜单。)

显示标尺后,您将看到所有制表位,这将解释当您到达最后一个制表位时标签的包装原因。

因此,您需要的解决方案是为段落样式对象创建所需的选项卡数组,然后将其设置为NSTextView的样式。

这是一种创建标签的方法。在这个例子中,它将创建5个左对齐的标签,每个标签相距1.5英寸:

-(NSMutableAttributedString *) textViewTabFormatter:(NSString *)aString
{
    float columnWidthInInches = 1.5f;
    float pointsPerInch = 72.0f;

    NSMutableArray * tabArray = [NSMutableArray arrayWithCapacity:5];

    for(NSInteger tabCounter = 0; tabCounter < 5; tabCounter++)
    {
        NSTextTab * aTab = [[NSTextTab alloc] initWithType:NSLeftTabStopType location:(tabCounter * columnWidthInInches * pointsPerInch)];
        [tabArray addObject:aTab];
    }

    NSMutableParagraphStyle * aMutableParagraphStyle = [[NSParagraphStyle defaultParagraphStyle]mutableCopy];
    [aMutableParagraphStyle setTabStops:tabArray];

    NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] initWithString:aString];
    [attributedString addAttribute:NSParagraphStyleAttributeName value:aMutableParagraphStyle range:NSMakeRange(0,[aString length])];

    return attributedString;
}

然后在向NSTextView添加任何文本之前调用它,以便设置默认段落样式及其中的制表位:

[[mainTextView textStorage] setAttributedString:[self textViewTabFormatter:@" "]];

如果您需要更深入的教程,可以在此处找到其他信息:

http://www.mactech.com/articles/mactech/Vol.19/19.08/NSParagraphStyle/index.html

答案 1 :(得分:0)

我分享我的经验,因为我最近遇到了类似的问题 - 按下标签时,光标会在大约10-12个标签后跳转到下一行 - 当有多行文字时,按下标签时整段会变成项目符号行

我使用了“Ed Fernandez”的上述方法,并且只能在NSTextView最初没有文本时解决问题,但是当加载现有的保存文本时,它有上述问题

为此我从下面的链接尝试了下面的代码(它确实起作用并解决了这两个问题) http://www.cocoabuilder.com/archive/cocoa/159692-nstextview-and-ruler-tab-settings.html

如果您使用自动引用计数,则无需调用“release”。

- (IBAction)formatTextView:(NSTextView *)editorTextView
{
   int cnt;
   int numStops = 20;
   int tabInterval = 40;
   NSTextTab *tabStop;

   NSMutableDictionary *attrs = [[NSMutableDictionary alloc] init];
   //attributes for attributed String of TextView

   NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];

   // This first clears all tab stops, then adds tab stops, at desired intervals...
   [paraStyle setTabStops:[NSArray array]];
   for (cnt = 1; cnt <= numStops; cnt++) {
      tabStop = [[NSTextTab alloc] initWithType:NSLeftTabStopType location: tabInterval * (cnt)];
      [paraStyle addTabStop:tabStop];
   }

   [attrs setObject:paraStyle forKey:NSParagraphStyleAttributeName];

   [[editorTextView textStorage] addAttributes:attrs range:NSMakeRange(0, [[[editorTextView textStorage] string] length])];
}

这个标签限制是由于“标尺”概念,它限制在大约12个tabstops。您可以通过调用

来查看标尺
[editorTextView setRulerVisible:YES];