1

タブの行を入力すると、51列目以降のNSTextViewの行の折り返しに奇妙な問題が発生します。これはタブでのみ発生し、51番目の文字の後ではなく、テキストビューの端で正しく折り返される他の文字では発生しません。

これは簡単に繰り返すことができます。1つのウィンドウと1つのNSTextViewを使用して、XCodeで空のプロジェクトを作成します。デフォルト以外の唯一の設定は、制約を削除し、古いスタイルの自動サイズ設定を使用して、ウィンドウ全体に表示されるようにテキストビューのサイズを自動化したことです。私はコードを書きませんでした。次に、アプリケーションを実行し、51文字よりもはるかに広いウィンドウを開いて、Tabキーを押したままにすると、早く折り返されます。

前もって感謝します。

4

2 に答える 2

2

ここでの問題は、NSTextViewにデフォルトのNSMutableParagraphStyleオブジェクトがあり、行の折り返し、タブストップ、マージンなどの属性のリストがあることです。これは、[フォーマット]メニュー、テキストサブビューに移動し、[表示]を選択することで確認できます。ルーラー」メニュー。(このメニューは、NSTextViewで無料で入手できます)。

ルーラーを表示すると、すべてのタブストップが表示されます。これにより、最後のタブストップに到達したときにタブが折り返される理由が説明されます。

したがって、必要な解決策は、段落スタイルオブジェクトに必要なタブの配列を作成し、それをNSTextViewのスタイルに設定することです。

タブを作成する方法は次のとおりです。この例では、それぞれ1.5インチ離れた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

于 2013-05-26T18:19:04.417 に答える
0

最近、同じタイプの問題が発生したので、経験を共有しています。タブを押すと、カーソルが約10〜12タブ後に次の行にジャンプします。テキストが複数行ある場合、タブを押すと、段落全体が箇条書きになります

「EdFernandez」で上記の方法を使用しましたが、最初に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];
于 2014-01-30T12:53:56.383 に答える