UITextViewのサイズをコンテンツに合わせるにはどうすればよいですか?


521

UITextView内容に合わせてaのサイズを調整する良い方法はありますか?たとえば、UITextView1行のテキストを含むがあるとします。

"Hello world"

次に、別のテキスト行を追加します。

"Goodbye world"

Cocoa Touchでrectテキストビューのすべての行を保持して、それに応じて親ビューを調整できるようにする良い方法はありますか?

別の例として、カレンダーアプリケーションのイベントのノートのフィールドを見てください。セル(およびセルUITextViewに含まれる)がどのように拡張され、ノートの文字列内のすべてのテキスト行が保持されているかに注意してください。


正解を更新することを検討してください。受け入れられたものは不要な計算につながるため、この問題のcontentSizeプロパティがあります。
Juan Boero

回答:


610

これはiOS 6.1とiOS 7の両方で機能します。

- (void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;
}

またはSwift(iOS 11のSwift 4.1で動作)

let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
textView.frame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)

iOS 6.1のサポートが必要な場合は、以下も行う必要があります。

textview.scrollEnabled = NO;

1
UITextViewをUITableViewCellにサイズ変更するためにiOS 7でテストされました。本当に素晴らしい作品。これが最終的に私のために働いた唯一の答えです。ありがとう!
Alex

37
私は、必要に応じてtextview.scrollEnabled = NO;も、iOSの7で切断し得ることからテキストを防ぐために
ブライアン

19
CGFLOAT_MAX代わりにマクロを使用することをお勧めしますMAXFLOAT。32/64ビットプラットフォームの両方で適切。
Eonil 2014

3
次の行に入る前に少し変動に直面している人はこれを追加します `NSRange bottom = NSMakeRange(textView.text.length -1、1); [textView scrollRangeToVisible:bottom]; `
ajay_nasa 2015

4
SwiftバージョンでsizeThatFits(...)への2つの別々の呼び出しがあるのはなぜですか?最初の行は何ですか?
nekonari

576

これはiOS 7以降では機能しません

UITextViewコンテンツの適切な高さにサイズ変更する非常に簡単な方法が実際にあります。これはを使用して行うことができますUITextView contentSize

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

もう一つ注意すべきは、正しいことでcontentSizeのみ使用可能ですUITextViewにビューに追加されましたaddSubview。それより前はframe.size

自動レイアウトがオンの場合、これは機能しません。自動レイアウトでは、一般的な方法は、sizeThatFitsメソッドを使用constantして高さの制約の値を更新することです。

CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size];
heightConstraint.constant = sizeThatShouldFitTheContent.height;

heightConstraint プロパティは、ストーリーボードで作成された高さ制約にプロパティをリンクすることにより、IBOutletを介して通常設定するレイアウト制約です。


次の場合は、この驚くべき答え、2014年に追加してください。

[self.textView sizeToFit];

iPhone6 +のみで動作に違いがあります。

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

6歳以上(5歳や6歳ではない)の場合、UITextViewに「もう1つの空白行」が追加されます。「RLソリューション」はこれを完全に修正します。

CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;

6以上の「余分な線」の問題を修正します。


2
あなたは私の日を救った。これを忘れて、selfCalculatingクラス関数の拡張に苦労していました。ありがとうございました。
Lukasz

4
ああ!テキストビューの高さを設定してから、それを含むビューの高さを調整していました。どうやら私がそうしたとき、テキストビューの高さが調整されていました。含まれているビューの高さを最初に設定すると、物事が期待どおりに機能します(あるいは、期待どおりに機能します)。
ホットリックス

11
[_textView sizeToFit]を使用すると、contentSizeプロパティが更新され、事前にscrollViewに追加する必要がなくなります。
ロドリゴ

1
自動レイアウトを使用する場合layoutIfNeededは、スーパービューを呼び出します。次に、から高さを取得できますcontentSize
ファットマン2013年

4
ただし、外側のコンテナのサイズを変更する必要があります。その動作はiOS 7で変更されました。リンクされた質問で、sizeToFitとlayoutIfNeededを追加する場所を示します。
Henrik Erlandsson 2013年

93

UITextView内で動的にサイズを調整するためにUITableViewCell、次の組み合わせがXcode 6とiOS 8 SDKで機能することがわかりました。

  • a UITextViewをaに追加し、UITableViewCellそれを側面に拘束する
  • UITextViewscrollEnabledプロパティをに設定しNOます。スクロールを有効にすると、のフレームはUITextViewコンテンツサイズに依存しませんが、スクロールを無効にすると、2つの間に関係ができます。
  • テーブルが元のデフォルトの行の高さ44を使用している場合、行の高さは自動的に計算されますが、デフォルトの行の高さを他のものに変更した場合は、手動で行の高さの自動計算をオンにする必要がありますviewDidLoad

    tableView.estimatedRowHeight = 150;
    tableView.rowHeight = UITableViewAutomaticDimension;
    

読み取り専用の動的なサイズ変更UITextViewの場合は、これで終わりです。ユーザーが内のテキストを編集できるようにする場合はUITextView、次のことも行う必要があります。

  • プロトコルのtextViewDidChange:メソッドを実装し、テキストが編集されるたびに自身を再描画するUITextViewDelegateように指示tableViewします。

    - (void)textViewDidChange:(UITextView *)textView;
    {
        [tableView beginUpdates];
        [tableView endUpdates];
    }
    
  • そして、UITextViewデリゲートをどこか、Storyboardまたはどこかに設定することを忘れないでくださいtableView:cellForRowAtIndexPath:


私にとって最良の答え。完全に機能し、UITableViewAutomaticDimensionがiOS 5に追加されたため、下位互換性があります。
smmelzer 2015

4
うまくいきませんでした。textViewDidChangeメソッドを使用すると、文字を入力するたびにテーブルビューがバウンスします。私が提案しているのは、tableView:cellForRowAtIndexPathメソッドで、そのメソッドを使用する代わりに、読み取り専用モードの場合、.scrollEnabledをNOに設定し、編集ビューセットの場合、スクロールがYESになっています。このように表示すると、常に全文が表示され、編集時には全文から開始されます。さらにテキストを追加すると、以前のテキストが上からスクロールして同じサイズのままになります
SimonTheDiver

3
さらに、空のテキストフィールドには高さがなく、タップして編集を開始できなかったため、テキストビューに> =高さ制約を追加しました。
SimonTheDiver

優れたソリューション。私にとって、それtableView.rowHeight = UITableViewAutomaticDimensionは不必要でした。
Christopher Pickslay

再びブレット・ドナルドに感謝します!私はこれを行う方法を忘れて、1年以上後にもう一度答えを見つけました😀。
Eric Conner、

76

コードとストーリーボードの両方を使用する非常に簡単な作業ソリューション。

コード別

textView.scrollEnabled = false

ストーリーボード

スクロールをオフにする

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

これ以外に何もする必要はありません。


5
この答えは正しいです。StoryBoardでは、UILabelと同じようにTextView AutoSizeがあります。必要なのはscrollEnabled = falseを設定することだけです。
pnavk

4
基本的にこれは正しいです。Autolayout制約を使用していて、スクロールを停止している場合は、すべてが機能します。
Dan Rosenstark

2
どうもありがとう。それは、単純な、ストーリーボードまたはコードで単に無効にスクロールし、それが0線でUILabelのようになります
samir105

@Mansuu ....これは保証された解決策ではありません。固有のコンテンツサイズを上書きするために実行できることがあり、ビューがレイアウトされた後にテキストを変更した場合、設定しない限り更新されません。アップも。しかし、これらはテキストフィールドでnumberOfLines = 0を設定する場合にも当てはまります。これが機能しない場合は、おそらく他の制約があり、暗黙的に高さが設定されます。
Jake T.

2
@iOSに高さ制約を追加する場合は、制約の優先度を低くします。そうしないと機能しません。
Alok、

61

スウィフト:

textView.sizeToFit()

14
さらに、これを機能させるには、スクロールを有効にしてfalseに設定する必要があることがわかりました。textView.scrollEnabled = false
tmarkiewicz 2016年

1
textView.sizeToFit()の後でtextView.layoutIfNeeded()を呼び出すことを忘れないでください
Daniel Kuta

5
@tmarkiewiczテキストがデバイスの画面に収まる場合に機能しますが、テキストが画面上のスペースよりも大きい場合は問題になります。スクロールして残りのテキストを表示することはできません。
フランシスコロメロ

これが答えです!!! より複雑なソリューションは必要ありません!!! @FranciscoRomeroなぜ、あなたは常にテーブルまたはビューcolleciton ....スクロールすることができ、テーブルセルまたはcollecitonビューセル内のTextViewを入れない
ベン・スミス

23

私の(限られた)経験では、

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

は改行文字を考慮しないため、CGSize実際に必要な長さよりもはるかに短くなる可能性があります。

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

改行を尊重するようです。

また、テキストは実際にはの上部に表示されませんUITextView。私のコードでは、の新しい高さをUITextViewsizeOfFontメソッドから返される高さよりも24ピクセル大きくなるように設定しました。


3
これは、UILabelにテキストを描画するかのようにサイズを取得します。そのサイズをuitextviewのフレームに設定すると、スクロールが必要になります。
ケブラー

22

iOS6ではcontentSize、テキストを設定した直後にUITextView のプロパティを確認できます。iOS7では、これは機能しなくなります。iOS7でこの動作を復元する場合は、UITextViewのサブクラスに次のコードを配置します。

- (void)setText:(NSString *)text
{
    [super setText:text];

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        CGRect rect = [self.textContainer.layoutManager usedRectForTextContainer:self.textContainer];
        UIEdgeInsets inset = self.textContainerInset;
        self.contentSize = UIEdgeInsetsInsetRect(rect, inset).size;
    }
}

2
これについてどこでもっと読むことができますか?これに関するiOS 7の新しい動作のように見えて、私は完全に迷っています。
StianHøiland2013

可変CGSizeサイズの意味は何ですか?
Tchelow 2013年

私はサイズを削除しましたが、そこにあるはずではありませんでした。
ファットマン2013年

18

誰かがこの時点まで読む勇気がある(または十分に絶望している)場合に備えて、ページの下部に正しい解決策を掲載します。

そのテキストをすべて読みたくない人のためのgitHubリポジトリがあります:resizableTextView

これはiOs7(iOs8でも機能すると思います)およびautolayoutで動作します。マジックナンバーは必要ありません。レイアウトなどを無効にしてください。短くエレガントなソリューション。

私は、すべての制約関連のコードはupdateConstraintsメソッドに行くべきだと思います。それでは、自分で作ってみましょうResizableTextView

ここで最初に遭遇する問題は、viewDidLoadメソッドの前に実際のコンテンツサイズを知らないことです。長くてバグの多い道をたどって、フォントサイズ、改行などに基づいて計算することができます。しかし、堅牢なソリューションが必要なので、次のようにします。

CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

これで、どこにいても、前でも後でも、実際のcontentSizeがわかりviewDidLoadます。次に、textViewに高さの制約を追加します(ストーリーボードまたはコードを介して、どのようにしても)。その値を次のように調整しますcontentSize.height

[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
    if (constraint.firstAttribute == NSLayoutAttributeHeight) {
        constraint.constant = contentSize.height;
        *stop = YES;
    }
}];

最後に行うことは、スーパークラスにを伝えることupdateConstraintsです。

[super updateConstraints];

これで、クラスは次のようになります。

ResizableTextView.m

- (void) updateConstraints {
    CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

    [self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
        if (constraint.firstAttribute == NSLayoutAttributeHeight) {
            constraint.constant = contentSize.height;
            *stop = YES;
        }
    }];

    [super updateConstraints];
}

きれいできれいですよね?そして、コントローラーでそのコードを処理する必要はありません。

ちょっと待って! Yアニメーションなし!

変更を簡単にアニメーション化して、textViewスムーズにストレッチできます。次に例を示します。

    [self.view layoutIfNeeded];
    // do your own text change here.
    self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
    [self.infoTextView setNeedsUpdateConstraints];
    [self.infoTextView updateConstraintsIfNeeded];
    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
        [self.view layoutIfNeeded];
    } completion:nil];

4
CGFLOAT_MAXではなくを使用してくださいFLT_MAX
rob mayoff 2014

この素晴らしいソリューションに複数の賛成票を投じられるといいのですが。
スクーター2014年

13

やってみました[textView sizeThatFits:textView.bounds]か?

編集:sizeThatFitsはサイズを返しますが、実際にはコンポーネントのサイズを変更しません。それがあなたの望むものなのか、それとも[textView sizeToFit]あなたが探していたもの以上のものなのか、私にはわかりません。どちらの場合でも、あなたが望むようにコンテンツに完全に合うかどうかはわかりませんが、それが最初に試すことです。


2
sizetofitはその日を節約します
マイケルズノーデン2014年

9

別の方法は、メソッドを使用して特定の文字列が占めるサイズを見つけることNSStringです。

-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

これは、指定された文字列を指定されたフォントに合わせる長方形のサイズを返します。希望の幅と最大の高さのサイズを渡すと、テキストに合わせて返された高さがわかります。改行モードも指定できるバージョンがあります。

次に、返されたサイズを使用して、ビューのサイズをフィットするように変更できます。


8

UITextView手元にない場合(たとえば、テーブルビューのセルのサイズを変更する場合)は、文字列を測定してサイズを計算し、の両側にある8 ptのパディングを考慮する必要がありますUITextView。たとえば、テキストビューの目的の幅がわかっていて、対応する高さを把握したい場合は、次のようにします。

NSString * string = ...;
CGFloat textViewWidth = ...;
UIFont * font = ...;

CGSize size = CGSizeMake(textViewWidth - 8 - 8, 100000);
size.height = [string sizeWithFont:font constrainedToSize:size].height + 8 + 8;

ここで、各8は4つのパッドエッジの1つを占めており、100000は非常に大きな最大サイズとして機能します。

実際font.leadingには、高さに余分を追加することができます。これにより、テキストの下に空白行が追加されます。テキストビューのすぐ下に視覚的に重いコントロールがある場合は、見栄えがよくなる場合があります。


iOS 8.1の完璧な結果
ロジック

私にとってはパディングが鍵でした
thibaut noah '10 / 12/10

8

制約によってそれを行うことができます。

  1. UITextViewの高さ制約を設定します。 ここに画像の説明を入力してください

2.その高さ制約のIBOutletを作成します。

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *txtheightconstraints;

3. textviewのデリゲートを設定することを忘れないでください。

4。

-(void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    NSLog(@"this is updating height%@",NSStringFromCGSize(newFrame.size));
    [UIView animateWithDuration:0.2 animations:^{
                  _txtheightconstraints.constant=newFrame.size.height;
    }];

}

次に、このように制約を更新します:)


それは素晴らしいニックネームです!
Fattie

定数を設定した後は、[textView layoutIfNeeded]を実行する必要があります。アニメーションブロック内。(Autolayoutアニメーションはそのようにします。)
Will Larche

7

次のことで十分です。

  1. あなたのためにスクロールを有効にしてNOに設定することを忘れないでくださいUITextView

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

  1. 自動レイアウト制約を適切に設定します。

あなたも使うかもしれませんUITableViewAutomaticDimension


6

Mike McMasterの回答と組み合わせると、次のようなことを行うことができます。

[myTextView setDelegate: self];

...

- (void)textViewDidChange:(UITextView *)textView {
  if (myTextView == textView) {
     // it changed.  Do resizing here.
  }
}

6

テキストフィールドの高さをその中のテキストに応じてサイズ変更する方法を見つけ、テキストフィールドの高さに基づいてその下にラベルを配置しました!これがコードです。

UITextView *_textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 10, 300, 10)];
NSString *str = @"This is a test text view to check the auto increment of height of a text view. This is only a test. The real data is something different.";
_textView.text = str;

[self.view addSubview:_textView];
CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 5 + frame.origin.y + frame.size.height, 300, 20)];
lbl.text = @"Hello!";
[self.view addSubview:lbl];

ここで、yLabelのy座標の「5」は、textViewとLabelの間に必要なギャップです。
dheeraj 2011年

6

autolayoutを使用している人でsizetofitが機能しない場合は、幅の制約を一度確認してください。幅の制約を見逃した場合、高さは正確になります。

他のAPIを使用する必要はありません。1行ですべての問題が修正されます。

[_textView sizeToFit];

ここでは、高さのみを考慮し、幅は固定し、ストーリーボードのTextViewの幅の制約を見逃していました。

そして、これはサービスからの動的コンテンツを表示することでした。

これがお役に立てば幸いです。


6

iOS 8以降、UITableViewの自動レイアウト機能を使用して、カスタムコードをまったく使用せずにUITextViewを自動的にサイズ変更できます。私はこれを実際に実行するプロジェクトをgithubに入れましたが、ここに鍵があります:

  1. UITextViewでスクロールを無効にする必要があります。これは、プログラムまたはインターフェイスビルダーを使用して行うことができます。スクロールすると大きなコンテンツを表示できるため、スクロールが有効になっている場合はサイズ変更されません。
  2. UITableViewControllerのviewDidLoadで、estimatedRowHeightの値を設定してrowHeightから、をに設定する必要がありUITableViewAutomaticDimensionます。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = self.tableView.rowHeight;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}
  1. プロジェクトの展開ターゲットはiOS 8以上である必要があります。

1
この種の回答はお勧めできません。ここに関連するコードを投稿する必要があります。
Antzi 2015年

5

すべての回答を確認しましたが、すべて固定幅を維持し、高さのみを調整しています。幅も調整したい場合は、この方法を非常に簡単に使用できます。

テキストビューを構成するときは、スクロールを無効に設定してください

textView.isScrollEnabled = false

そしてデリゲートメソッドでfunc textViewDidChange(_ textView: UITextView)このコードを追加します。

func textViewDidChange(_ textView: UITextView) {
    let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
    textView.frame = CGRect(origin: textView.frame.origin, size: newSize)
}

出力:

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

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


デリゲートメソッドが呼び出されない@Peter Stajger
Mansuu ....

4

これはUITextView、特定の領域に合わせてテキストを作成する必要があるときにうまく機能しました。

//テキストは既にサブビューに追加されている必要があります。追加されていない場合、contentviewsizeは正しくありません。

-(void)reduceFontToFit:(UITextView *)tv {
    UIFont * font = tv.font;
    double pointSize = font.pointSize;

    while(tv.contentSize.height> tv.frame.size.height && pointSize> 7.0){
        pointSize-= 1.0;
        UIFont * newFont = [UIFont fontWithName:font.fontName size:pointSize];
        tv.font = newFont;
    }
    if(pointSize!= font.pointSize)
        NSLog(@ "%。1fから%.1fまでのフォント"、pointSize、tv.font.pointSize);
}

4

これは@jhibberdのSwiftバージョンです

    let cell:MsgTableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("MsgTableViewCell", forIndexPath: indexPath) as? MsgTableViewCell
    cell.msgText.text = self.items[indexPath.row]
    var fixedWidth:CGFloat = cell.msgText.frame.size.width
    var size:CGSize = CGSize(width: fixedWidth,height: CGFloat.max)
    var newSize:CGSize = cell.msgText.sizeThatFits(size)
    var newFrame:CGRect = cell.msgText.frame;
    newFrame.size = CGSizeMake(CGFloat(fmaxf(Float(newSize.width), Float(fixedWidth))), newSize.height);
    cell.msgText.frame = newFrame
    cell.msgText.frame.size = newSize        
    return cell

6
問題は本当に言語にとらわれないことです。UIKit関連の質問に対するすべての回答に対して、戻って迅速なポートを作成することが本当に必要ですか?それは騒々しい会話をするように思えます。
eremzeit 2015

これらの質問のほとんどに特定のプログラミング言語がないため、迅速な言語を検索してもGoogleで見つけることができるという問題
Fareed Alnamrouti

4

スクロールを無効にする

制約を追加

そしてあなたのテキストを追加

[yourTextView setText:@"your text"];
[yourTextView layoutIfNeeded];

使用するUIScrollView場合は、これも追加する必要があります。

[yourScrollView layoutIfNeeded];

-(void)viewDidAppear:(BOOL)animated{
    CGRect contentRect = CGRectZero;

    for (UIView *view in self.yourScrollView.subviews) {
         contentRect = CGRectUnion(contentRect, view.frame);
    }
    self.yourScrollView.contentSize = contentRect.size;
}


2

UITextViewDelegateを使用するのが最も簡単な方法です。

func textViewDidChange(_ textView: UITextView) {
    textView.sizeToFit()
    textviewHeight.constant = textView.contentSize.height
}

1

お役に立てれば:

- (void)textViewDidChange:(UITextView *)textView {
  CGSize textSize = textview.contentSize;
  if (textSize != textView.frame.size)
      textView.frame.size = textSize;
}

これは機能しません!これは、エラーの原因:「左辺値が代入の左オペランドとして必要」
リヴァイアサン

にのみ割り当てることができtextView.frameます。
jweyrich

1

他のものがここに来た場合、この解決策は私のために機能します、1 "Ronnie Liew" +4 "user63934"(私のテキストはWebサービスから到着します):1000に注意してください(「私の場合」はそれほど大きくありません)

UIFont *fontNormal = [UIFont fontWithName:FONTNAME size:FONTSIZE];

NSString *dealDescription = [client objectForKey:@"description"];

//4
CGSize textSize = [dealDescription sizeWithFont:fontNormal constrainedToSize:CGSizeMake(containerUIView.frame.size.width, 1000)];

CGRect dealDescRect = CGRectMake(10, 300, containerUIView.frame.size.width, textSize.height);

UITextView *dealDesc = [[[UITextView alloc] initWithFrame:dealDescRect] autorelease];

dealDesc.text = dealDescription;
//add the subview to the container
[containerUIView addSubview:dealDesc];

//1) after adding the view
CGRect frame = dealDesc.frame;
frame.size.height = dealDesc.contentSize.height;
dealDesc.frame = frame;

それが…乾杯


1

テキストのサイズに応じてUITextViewの高さを変更するために私が見つけた最良の方法。

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX)];

またはあなたは使うことができます

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX) lineBreakMode:NSLineBreakByTruncatingTail];

1

テキストビューを実際に上に動かして、最終行の位置を維持したい人のために

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

if(frame.size.height > textView.frame.size.height){
    CGFloat diff = frame.size.height - textView.frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y - diff, textView.frame.size.width, frame.size.height);
}
else if(frame.size.height < textView.frame.size.height){
    CGFloat diff = textView.frame.size.height - frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y + diff, textView.frame.size.width, frame.size.height);
}

1

動作する唯一のコードは、上記のjhibberd回答のように「SizeToFit」を使用するコードですが、実際には、ViewDidAppear呼び出すか、UITextViewテキスト変更イベントにワイヤリングしない限り、ピックアップされません。


1

Nikita Tookの回答に基づいて、iOS 8のautolayoutで動作するSwiftの次のソリューションに行きました。

    descriptionTxt.scrollEnabled = false
    descriptionTxt.text = yourText

    var contentSize = descriptionTxt.sizeThatFits(CGSizeMake(descriptionTxt.frame.size.width, CGFloat.max))
    for c in descriptionTxt.constraints() {
        if c.isKindOfClass(NSLayoutConstraint) {
            var constraint = c as! NSLayoutConstraint
            if constraint.firstAttribute == NSLayoutAttribute.Height {
                constraint.constant = contentSize.height
                break
            }
        }
    }

1

迅速な回答:次のコードは、textViewの高さを計算します。

                let maximumLabelSize = CGSize(width: Double(textView.frame.size.width-100.0), height: DBL_MAX)
                let options = NSStringDrawingOptions.TruncatesLastVisibleLine | NSStringDrawingOptions.UsesLineFragmentOrigin
                let attribute = [NSFontAttributeName: textView.font!]
                let str = NSString(string: message)
                let labelBounds = str.boundingRectWithSize(maximumLabelSize,
                    options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                    attributes: attribute,
                    context: nil)
                let myTextHeight = CGFloat(ceilf(Float(labelBounds.height)))

これで、textViewの高さを次のように設定できます。 myTextHeight


すみません、どういう意味let attribute = [NSFontAttributeName: textView.text.font!] ですか?これは本当にエラーのないSwiftコードですか?)もしかして let attribute = [NSFontAttributeName: textView.font!]
Massmaker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.