如果输入一行标签,我在第51列之后的NSTextView换行时遇到一个奇怪的问题。这只发生在标签上,而不是任何其他字符,它们正确地包裹在文本视图的边缘,而不是在第51个字符之后。
这很容易重复。使用单个窗口和一个NSTextView在XCode中创建一个空白项目。唯一的非默认设置是我删除了约束,并使用旧样式自动调整大小来自动调整textview以填充窗口。我没有写过代码。现在运行应用程序,打开窗口,使其宽度超过51个字符,按住Tab键,它将提前换行。
提前致谢。
答案 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];