如果输入选项卡行,第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/