スクロールを必要とせずにすべてのテキストがテキストビューに収まるように、テキストビューのフォントのサイズを縮小する非推奨の方法を見つけようとしています。
メソッド「sizeWithFont」は非推奨であり、ベストプラクティスを確実にしたいので、XCodeは「boundingRectWithSize」を使用するように言っていますが、これを使用してすべてのテキストが収まるようにフォントのサイズを小さくする方法がわかりません。
助言がありますか?いいえ、代わりにUILabelを使用することはできません。テキストを上部に垂直に配置する必要がありますが、UILabelはこれを行いません。
これはiOS 7以前で機能しました:
CGFloat fontSize;
CGFloat minSize;
if([deviceType isEqualToString:@"iPad"] || [deviceType isEqualToString:@"iPad Simulator"]){
fontSize = 40;
minSize = 15;
}
else{
fontSize = 18;
minSize = 8;
}
while (fontSize > minSize)
{
CGSize size = [quote sizeWithFont:[UIFont fontWithName:@"Interstate" size:fontSize] constrainedToSize:CGSizeMake(newView.frame.size.width, 10000)];
if (size.height <= newView.frame.size.height) break;
fontSize -= 1.0;
}
sizeWithFont: constrainedToSize:
を:に置き換えるだけで問題を解決できます。
boundingRectWithSize:CGSizeMake(newView.frame.size.width, FLT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Interstate" size:fontSize]}
context:nil];
sizeThatFits
メソッドは、次のようにこの問題に対処するために使用できます。
while (fontSize > minSize && [newView sizeThatFits:(CGSizeMake(newView.frame.size.width, FLT_MAX))].height >= newView.frame.size.height ) {
fontSize -= 1.0;
newView.font = [tv.font fontWithSize:fontSize];
}
これらの解決策の1つがあなたの問題を解決することを願っています。乾杯!
同じことをしなければなりませんでしたが、プログラムでAutoLayout制約(NSLayoutConstraint
)を追加しました。制約のため、contentSize
はほとんどの場合正しくなく、UITextView
がスクロールしていました:/正しいフォントサイズを取得するために、古き良き試行錯誤のテストを行うために、新しいUITextView
を作成することになりました。そこを通り抜ける。
非常にシンプルですが、あなたがそれを思い付く必要があるすべてのものと同じように:)
_NSInteger fontSize = 200;
UITextView *testTextView = [[UITextView alloc] init];
testTextView.text = self.myRealTextView.text;
testTextView.font = [UIFont fontWithName:@"AldotheApache" size:fontSize];
while ([testTextView sizeThatFits:(CGSizeMake(self.myRealTextView.frame.size.width, FLT_MAX))].height >= self.myRealTextView.frame.size.height ) {
fontSize -= 0.5;
testTextView.font = [UIFont fontWithName:@"AldotheApache" size:fontSize];
}
NSLog(@"Correct font size is: %ld",(long)fontSize);
self.myRealTextView.font = [UIFont fontWithName:@"AldotheApache" size:fontSize];
_
UITextViewのsizeThatFits
を試してください。おそらく次のように使用できます。
//Set text content of UITextView
//...
while (fontSize > minSize) {
// Set font size of UITextView
CGSize size = [textView sizeThatFits:(CGSizeMake(textView.frame.size.width, FLT_MAX)];
if (size.height <= newView.frame.size.height) break;
fontSize -= 1.0;
}
UITextViewはUIScrollView->のサブクラスであるため、テキストまたはフォントをtextViewに設定した後、スクロール可能な領域のcontentSizeを確認できます。
textView.text = quote;
do
{
textView.font = [UIFont fontWithName:@"Interstate" size:fontSize];
[textView layoutIfNeeded];
if (textView.contentSize.height <= newView.frame.size.height) {
break;
}
fontSize -= 1.0;
} while (fontSize >= minSize);
それはうまくいくはずです...おそらく[textViewlayoutIfNeeded]がなくてもうまくいくでしょう。
Swift 5+
var fontSize = Font.Size.section.rawValue
let minSize = Font.Size.large.rawValue
while fontSize > minSize {
let textViewSize = CGSize(width: textView.frame.size.width, height: textView.frame.size.height)
let size = textView.sizeThatFits(textViewSize)
if size.height <= textViewSize.height {
break
}
fontSize -= 1.0
}
textView.font = Font.primary.of(size: fontSize)