在NSTextView过早换行使用标签时(Premature line wrapping in NS

2019-07-18 02:46发布

我有,如果我输入一行标签的第51列之后NSTextView linewrapping一个奇怪的问题。 这仅与凸片发生,不与任何其他字符,它包裹在正确文本视图的边缘,第51字符后不。

这是很容易重复。 与单个窗口在Xcode中创建一个空白的项目,只是一个NSTextView。 唯一的非默认设置是我已删除的约束,以及所使用的老式自动调整到自动调整TextView的使其充满窗口。 我已经写任何代码。 现在运行应用程序,打开的窗口,以便为更广泛的超过51个字符,按住TAB键,它会早换。

提前致谢。

Answer 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



Answer 2:

我分享我的经验,因为我最近有一种相同类型的问题(S)的 - 按选项卡时,光标跳到下一行后约10-12标签 - 当有多行文本,按标签上的时整款变成符号线

我用“埃德·费尔南德斯”采用上述方法,当有在NSTextView没有文本最初但现有保存的文本被加载时,它有上述问题只能解决问题

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

你不需要调用“释放”,如果你使用自动引用计数。

- (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制表位。 你可以通过调用看到标尺

[editorTextView setRulerVisible:YES];


文章来源: Premature line wrapping in NSTextView when tabs are used