如果输入选项卡行,第51列后的NSTextView换行会有一个奇怪的问题。这仅发生在制表符(而不是其他任何字符)上,而制表符正确地包装在文本视图的边缘,而不是第51个字符之后。

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

提前致谢。

最佳答案

这里的问题是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

关于macos - 使用制表符时NSTextView中的过早换行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14278119/

10-09 13:19