5

私はCocoaのドキュメントベースのMacOSXアプリケーションを持っています。

私のアプリにある機能の1つは、ダブルクリックして編集できるテキストアイテムのリストです。ユーザーがテキストアイテムの1つをダブルクリックすると、現在のウィンドウのfieldEditorテキストフィールドがクリックされたテキストアイテムの上に配置され、編集できるようになります。

1つの問題を除いて、すべてが正常に機能しています。テキストを折り返すのではなく、fieldEditorテキストフィールドをクリップ+スクロールする方法がわかりません。現在の外観は次のとおりです。

ここに画像の説明を入力してください

テキストが2行目にどのように折り返されているかを確認しますか?私はそれを望んでいません。スクロールする(そしてクリップされて見える)1行のままにしておきたいのですが。

テキストの少ないリストアイテムで正しく機能する例を次に示します。

ここに画像の説明を入力してください

ビューコントローラで試していることは次のとおりです。

NSWindow *win = [listItemView window];
NSText *fieldEditor = [win fieldEditor:YES forObject:listItemView];
[fieldEditor setFont:[TDListItemView titleFont]];
[fieldEditor setAlignment:NSLeftTextAlignment];
[fieldEditor setDrawsBackground:YES];
[fieldEditor setBackgroundColor:[NSColor whiteColor]];
[fieldEditor setString:str];
[fieldEditor setDelegate:self];
[fieldEditor selectAll:nil];

if ([fieldEditor isKindOfClass:[NSTextView class]]) {
    NSTextView *tv = (NSTextView *)fieldEditor;
    NSMutableParagraphStyle *style = [[[tv defaultParagraphStyle] mutableCopy] autorelease];
    [style setLineBreakMode:NSLineBreakByClipping];
    [tv setDefaultParagraphStyle:style];
}

CGRect r = [self fieldEditorRectForBounds:[listItemView bounds] index:idx]; // height here is 10.0
[fieldEditor setFrame:r];
[fieldEditor setNeedsDisplay:YES];
[[self view] addSubview:fieldEditor];
[win makeFirstResponder:fieldEditor];

真ん中の部分に注意してください。メソッドを呼び出すために、これfieldEditorがのインスタンスであるかどうかを確認します。これは、値を介してテキストをクリップするようにするための私の試みです。効果はありません。そして、これが1行でスクロールするために私がすべきことであるかどうかさえわかりません。NSTextViewsetDefaultParagraphStyle:fieldEditorNSLineBreakByClippingfieldEditor

また、私の-fieldEditorRectForBounds:index:方法で計算した長方形の高さは正しく、1行のテキスト(この場合は14.0ピクセル)に対して正しいサイズの長方形を提供していることにも注意してください。

fieldEditorスクロール/クリップされたテキストを1行表示するために何が欠けていますか?


また、中央のセクションにこれらの行を追加してみました。

    [[tv textContainer] setHeightTracksTextView:YES];
    [[tv textContainer] setWidthTracksTextView:YES];

これには、良好なの可視部分のサイズを変更するという望ましい効果がありますfieldEditor。しかし、悪いニュースは、テキストがクリップされてスクロールされるのではなく、まだ折り返されているという事実が変わらないことです。:(


これは、この定数に関連しているようです。

NSStringDrawingUsesLineFragmentOrigin

options:これは、次の引数で使用できます。

-[NSAttributedString drawWithRect:options:attributes:]

しかし、私の場合は、NSTextではなくフィールドエディタで作業していNSAttributedStringます。NSTextフィールドエディタでこの種のことを行う方法がわかりません。

4

3 に答える 3

3

うーん...NSTextViewは、スクロール動作を完全にNSScrollViewに依存しています。私が見ていないことがこれにもっとあるかどうかはわかりませんが、あなたの問題に対する「歴史的な」解決策は次のいずれかであるように見えます:

別のコントロールを使用する

編集を有効にし、動作としてスクロールを選択して、標準のIBラベル構成で編集可能なNSTextFieldを使用できます。適切に構成されている場合は、すでにすべての面倒な作業を行います。フィールドエディタを直接操作する必要はありません。

...または...

浮気

フィールドエディタを適切なサイズで構成されたNSScrollView(水平スクロールのみを許可し、スクローラーを表示しない)に動的に叩き込み、編集が終了したらスクロールビューを削除します。

于 2012-04-05T22:52:42.357 に答える
0
NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init];
[style setLineBreakMode:NSLineBreakByTruncatingHead];

NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init];
[attributes setObject:style forKey:NSParagraphStyleAttributeName];

NSTextView* textView = [[NSTextView alloc] init];
[textView setTypingAttributes:attributes];
于 2013-04-26T15:30:49.610 に答える
0

NSTextViewを使用する場合は、以下のコードを試してください...。

[self.textView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
[self.textView setHorizontallyResizable:YES];
[[self.textView textContainer] setWidthTracksTextView:NO];
[[self.textView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];
于 2019-09-04T03:16:20.013 に答える