UITextView
内にUIScrollView
があります。これはiOS 6
からビルドされたxcode 4.x
で完全に機能しましたが、xcode 5
でビルドすると正しく機能しません。 、iOS 6
でも。
問題は、UITextView
とUIScrollView
の幅が大きい場合でも、テキストが画面の幅で折り返されることです。このコードを使用して、UITextView
の新しい幅と高さを計算します。テキストビューが左右にスクロールしても、幅が画面の幅だけであるかのようにテキストが折り返されます。
ありがとう
self.responceTextView.text = [NSString stringWithFormat:@"%@%@",_responceTextView.text,responce];
[self textViewDidChange:self.responceTextView];
- (void)textViewDidChange:(UITextView *)textView
{
// Recalculate size of text field
CGSize maxSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
CGSize reqSize = [textView.text sizeWithFont:[UIFont fontWithName:@"Courier" size:12] constrainedToSize:maxSize lineBreakMode:NSLineBreakByClipping];
self.responceTextView.frame = CGRectMake(0, 0, reqSize.width+16, reqSize.height+16);
// Resize scroll view if needs to be smaller so text stays at top of screen
CGFloat maxScrollHeight = maxScrollViewSize.size.height;
if (self.responceTextView.frame.size.height < maxScrollHeight) {
self.responceScrollView.frame = CGRectMake(self.responceScrollView.frame.Origin.x, self.responceScrollView.frame.Origin.y, self.responceScrollView.frame.size.width, self.responceTextView.frame.size.height);
} else {
self.responceScrollView.frame = maxScrollViewSize;
}
// Set content size
self.responceScrollView.contentSize = CGSizeMake(self.responceTextView.frame.size.width, self.responceTextView.frame.size.height);
[self scrollToCursor];
}
編集----
わかりました。iOS7ではsizeWithFont
が非推奨になっているようです。コンパイラの警告が表示されないのは奇妙なことです。それでもiOS6で動作しないことは意味がありません(またはiOS 7 SDKでビルドしたときに完全に削除されますか?)
私はこれらの2つの選択肢を試しましたが、すべてからまったく同じサイズが返されます。
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"Courier" size:12], NSFontAttributeName,
nil];
CGRect rect = [textView.text boundingRectWithSize:maxSize options:NSLineBreakByClipping | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil];
戻り値:{{0, 0}, {439.27148, 168}}
CGSize rect2 = [textView.text sizeWithAttributes:attributes];
戻り値:{439.27148, 168}
そして、上記のオリジナルは{439.27148, 168}
を返します
それらはすべて、より広い視野を返すはずです。
編集2 ----上から、返されたフレームは正しい(439幅)ように見えますが、テキストビュー内でまだWordでラップされているのはテキストです。
使用してみてください:
[textView.text boundingRectWithSize:CGSizeMake(txtFrame.size.width, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:[NSDictionary dictionaryWithObjectsAndKeys:textView.font,NSFontAttributeName, nil] context:nil];
文字列の測定はかなりバグがあるようです。これは、私が行ったテストで適切なサイズを提供する唯一のオプションの組み合わせです。
私はiOS7で成功した次のコードを使用しています(最小および最大の高さのUITextField
です。テキストの高さがMAX_HEIGHT_MESSAGE_TEXTBOX
より大きくなると、スクロールバーがUITextField
に表示されます。 )。
const float MAX_HEIGHT_MESSAGE_TEXTBOX = 80;
const float MIN_HEIGHT_MESSAGE_TEXTBOX = 30;
- (void)setFrameToTextSize:(CGRect)txtFrame textView:(UITextView *)textView
{
if(txtFrame.size.height > MAX_HEIGHT_MESSAGE_TEXTBOX)
{
//OK, the new frame is to large. Let's use scroll
txtFrame.size.height = MAX_HEIGHT_MESSAGE_TEXTBOX;
textView.scrollEnabled = YES;
[textView scrollRangeToVisible:NSMakeRange([textView.text length], 0)];
}
else
{
if (textView.frame.size.height < MIN_HEIGHT_MESSAGE_TEXTBOX) {
//OK, the new frame is to small. Let's set minimum size
txtFrame.size.height = MIN_HEIGHT_MESSAGE_TEXTBOX;
}
//no need for scroll
textView.scrollEnabled = NO;
}
//set the frame
textView.frame = txtFrame;
}
- (void)setframeToTextSize:(UITextView *)textView animated:(BOOL)animated
{
//get current height
CGRect txtFrame = textView.frame;
//calculate height needed with selected font. Note the options.
//append a new line to make space for the cursor after user hit the return key
txtFrame.size.height =[[NSString stringWithFormat:@"%@\n ",textView.text]
boundingRectWithSize:CGSizeMake(txtFrame.size.width, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:[NSDictionary dictionaryWithObjectsAndKeys:textView.font,NSFontAttributeName, nil] context:nil].size.height;
if (animated) {
//set the new frame, animated for a more Nice transition
[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut |UIViewAnimationOptionAllowAnimatedContent animations:^{
[self setFrameToTextSize:txtFrame textView:textView];
} completion:nil];
}
else
{
[self setFrameToTextSize:txtFrame textView:textView];
}
}
- (void)textViewDidChange:(UITextView *)textView
{
[self setframeToTextSize:textView animated:YES];
}
[〜#〜]編集[〜#〜]
文字列の測定値が正しい場合は、lineBreakMode
のtextContainerのUITextView
を変更する必要がある場合があります。 (NSTextContainer
はiOS7の新しいクラスであり、テキストのレイアウト方法に関する情報が含まれています):
textView.textContainer.lineBreakMode = NSLineBreakByCharWrapping; // default is NSLineBreakByWordWrapping
幸運を!
メソッドsizeWithFont:(UIFont *)font constrainedToSize ..."
はiOS7で非推奨になりました。
それは正しく機能します。
IOS7でその代替をチェックしてください
NSString
のインスタンスメソッド
-(CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:
(NSDictionary *)attributes context:(NSStringDrawingContext *)context
この答えをチェックしてください。 非推奨のsizeWithFontの置き換え:iOS 7の場合?
スクロールビューのコンテンツサイズも大きくできるように、コンテンツサイズを計算したいと思います。はいの場合このリンクを使用してください https://stackoverflow.com/a/19152955/102308
「ありがとうございますが、これは私の問題に対処していないようです。柔軟な幅と高さの両方を使用しています。テキストビューが両方向に十分にスクロールすると、正しいサイズが返されるようですが、テキスト自体はまだワードラップされています。」
[textViewsizeToFit]でこれを修正しました。