web-dev-qa-db-ja.com

UITextViewフレームをコンテンツサイズに設定することは、Xcode5では機能しなくなりました

以下のコードスニペットは、Xcode 5をインストールする前に、UITextViewフレームのサイズをコンテンツの高さに変更するように機能しましたが、アップグレード以降は機能しません。

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

検索しましたが、修正が見つかりませんでした。何かご意見は?

11
Silverstar

IOS7にはこれに関する新しいものがあります。

テキストが更新された後にテキストビューで使用される「適合」サイズを取得するには、textViewのlayoutManagerプロパティでusedRectForTextContainer:を呼び出し、textViewのtextContainerプロパティを引数として渡します。

スクロールに関する警告:ただし、テキストビューのフレームサイズを変更するとafterテキストが更新され、スクロールが無効になっていると、予期しない視覚的なバグが発生する可能性があることに注意してください。テキストビュー。これが発生した場合は、テキストビューのテキストを編集する前にスクロールを有効に設定し、更新後に無効にします(スクロールを無効のままにする必要がある場合)。

26
jaredsinclair

IOS 7(Xcode 5)で動作するには、次のようにします。

  1. 次のように設定して、テキストを受信するためのスペース全体を指定します。

    [myTextView setScrollEnabled:YES];

  2. 実際のテキストを渡します。

    myTextView.text = theTextVariable;またはmyTextView.text = @"The text...";

  3. TextViewの自動サイズ変更:

    [myTextView sizeToFit];

  4. スクロールを無効にする:

    [myTextView setScrollEnabled:NO];

追記:myTextViewはself.myTextViewまたは_myTextViewとしても使用できます

楽しんでね!

14
Matheus Abreu

TextViewにcontentSizeを更新させる正しい方法は、

[textView layoutIfNeeded]

ただし、iOS 7.0および7.1では、最初に設定しない限り、これはまだ確実に機能しないようです。

textView.layoutManager.allowsNonContiguousLayout = false;

これがバグであるかどうかは私にはわかりません。「非連続レイアウト」が何を意味するのかについての適切な説明を実際に見つけることができないからです。

(私の個人的な使用例は、プログラムでtextView.text = newValueを更新してから、textViewのサイズを適切に変更しようとしています。)

6
c roald
[textView sizeToFit];

あなたが必要なものです。

あなたがする必要があるのはそれを確かめることです:

[textView setScrollEnabled:YES];

UITextViewテキストコンテンツを設定する前。

その後、次のことができます。

[textView sizeToFit];
[textView setScrollEnabled:NO];

テキストを設定した後。独自のブリンブリン関数を作成したり、複雑なバウンディングrectメソッドを使用したりするのと同じです。解決策が3行のように単純なのに、なぜこれほど複雑なものを使用するのでしょうか。

そうは言っても、これらの関数を次のようにラップします。

- (void) setText:(NSString *)theTextToAdd andResizeTheDamnTextView:(UITextView *)textView {
    [textView setScrollEnabled:YES];
    [textView setText:theTextToAdd];
    [textView sizeToFit];
    [textView setScrollEnabled:NO];
}

また、ファイルごとまたはグローバルベースで定義して、4行を手動で書き込んだり、コピーして貼り付けたりして、毎回呼び出す必要がないようにします。それを次のように呼んでください:

[yourTextViewIvar setText:@"DUMMY STRING" andResizeTheDamnTextView:yourTextViewIvar];

それが機能しない場合:

[yourTextViewIvar setText:[self setText:@"DUMMY STRING" andResizeTheDamnTextView:yourTextViewIvar]];

そして、あなたは金色になります。

おもう..

それが擬似コードです。参考までに。

3
topLayoutGuide