web-dev-qa-db-ja.com

テキストを設定した後、自動レイアウトでUITextViewの動的な高さを取得します

インターフェイスビルダーによって設定された自動レイアウトでスクロールできないUITextViewがあり、テキストは問題なく動的に増減しますが、テキストを設定した後の新しいUITextViewの高さを知りたいので、これをしようとしています:

NSLog(@"text before: %.2f",self.myText.frame.size.height);
[self.myText setText:self.string];
NSLog(@"text after: %.2f",self.myText.frame.size.height);

これが結果です:

text before: 47.50
text after: 47.50

私はそれを実行するとビュー内のテキストが増加しますが、サイズは同じです、テキストを設定した後に実際の高さを取得するにはどうすればよいですか?

22
Piero

これは動作するはずです:

NSLog(@"text before: %.2f",self.myText.frame.size.height);
[self.myText setText:self.string];
[self.myText layoutIfNeeded]; // <--- Add this
NSLog(@"text after: %.2f",self.myText.frame.size.height);

Githubの実装例を次に示します。 https://github.com/guillaume-algis/SO-27060338

13
Guillaume Algis

あなたがしなければならないのは、高さを除くすべての制約を設定することです[〜#〜] and [〜#〜] set textView 's scrollEnabled to NO。最後の部分は、トリックを行うものです。テキストビューは、そのテキスト値に応じて自動的にサイズ変更されます。

64
Pavel Gurov

すべて自動レイアウトで行う場合:

サイズインスペクターで:

  1. Content Compression Resistance Priority Verticalを1000に設定します。

  2. UITextViewの制約の高さの優先順位を下げます。 1000未満にします。

enter image description here

属性インスペクターで:

  1. チェック解除スクロール有効
22
Michael Revlis

私は次のリンクで与えられたコードを使用しました ダイナミックUITextViewの高さを持つオートレイアウト そしてそれは私のために働いた:)

13
Parul Garg

以下のコードを使用:

Objective-Cコード

[textView setScrollEnabled:NO];

スウィフトコード

textView.isScrollEnabled = false
7
Alok

Swift 3.

textView.isScrollEnabled = false

これにより、AutoLayoutがジョブを実行できるようになります。

6

テキストコールを変更した直後

[self.myText sizeToFit];
3
merocode

UILabelとは異なり、UITextViewには固有のサイズプロパティがありません。それで、私がどのようにUITextViewの高さ制約を設定し、IBOutletを介してフックし、textViewDidChangeで値を変更するか、テキストが変更されたときにそれを行いました。

@IBOutlet weak var textViewHeight: NSLayoutConstraint!

func textViewDidChange(textView: UITextView) {

    // dynamic height adjustments

    var height = ceil(textView.contentSize.height) // ceil to avoid decimal

    if height != textViewHeight.constant { // set when height changed
        textViewHeight.constant = height
        textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes
    }
}
2
Hlung
- (void)textViewDidChange:(UITextView *)textView
{
    UIFont *myFont = [UIFont systemFontOfSize:14];
    CGSize size =   [self sizeOfText:textView.text widthOfTextView:TextviewWidth withFont:myFont];
    NSLog(@"Height : %f", size.height);
}

-(CGSize)sizeOfText:(NSString *)textToMesure widthOfTextView:(CGFloat)width withFont:(UIFont*)font
{
    CGSize ts = [textToMesure sizeWithFont:font constrainedToSize:CGSizeMake(width-20.0, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
    return ts;
}
1
Hardik Kardani

テキストビューを選択し、「スクロール有効」のチェックを外します

トップメニューからテキストビューを選択します「エディター>コンテンツに合わせてサイズ」

その下のビューを選択し、そのtop constrainttextview bottomに任意のマージンを設定し、「サイズインスペクター」に移動して、ちょうど制約をダブルクリックまたは編集します追加し、「関係」を「以上」に設定します

1
zain ullah

さらに別のアプローチは

myTextView.textContainer.heightTracksTextView = true

スクロールを有効にすることができます

1
Henmyg

まあ、私はこのコードをSwift4構文に変換していませんが、ロジックは同じままです。これは、Xamarin.ios(C#)の拡張メソッドです。

public static nfloat GetEstimateHeight(this UITextView textView, UIView View)
{
    var size = new CoreGraphics.CGSize(View.Frame.Width, height: float.PositiveInfinity);
    var estimatedSize = textView.SizeThatFits(size);
    return estimatedSize.Height;
}

ここでSwift=に対して機能するロジックは

var size = new CoreGraphics.CGSize(View.Frame.Width, height: float.PositiveInfinity);
    var estimatedSize = textView.SizeThatFits(size);
    var textViewFinalHeight = estimatedSize.Height;
0
Shanu Singh