インターフェイスビルダーによって設定された自動レイアウトでスクロールできない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
私はそれを実行するとビュー内のテキストが増加しますが、サイズは同じです、テキストを設定した後に実際の高さを取得するにはどうすればよいですか?
これは動作するはずです:
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
あなたがしなければならないのは、高さを除くすべての制約を設定することです[〜#〜] and [〜#〜] set textView
's scrollEnabled
to NO
。最後の部分は、トリックを行うものです。テキストビューは、そのテキスト値に応じて自動的にサイズ変更されます。
私は次のリンクで与えられたコードを使用しました ダイナミックUITextViewの高さを持つオートレイアウト そしてそれは私のために働いた:)
以下のコードを使用:
Objective-Cコード
[textView setScrollEnabled:NO];
スウィフトコード
textView.isScrollEnabled = false
Swift 3.
textView.isScrollEnabled = false
これにより、AutoLayoutがジョブを実行できるようになります。
テキストコールを変更した直後
[self.myText sizeToFit];
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
}
}
- (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;
}
テキストビューを選択し、「スクロール有効」のチェックを外します
トップメニューからテキストビューを選択します「エディター>コンテンツに合わせてサイズ」
その下のビューを選択し、そのtop constraintでtextview bottomに任意のマージンを設定し、「サイズインスペクター」に移動して、ちょうど制約をダブルクリックまたは編集します追加し、「関係」を「以上」に設定します
さらに別のアプローチは
myTextView.textContainer.heightTracksTextView = true
スクロールを有効にすることができます
まあ、私はこのコードを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;