web-dev-qa-db-ja.com

iOS 7-すべてのテキストをビューに収めるためのUITextViewサイズのフォント(スクロールなし)

スクロールを必要とせずにすべてのテキストがテキストビューに収まるように、テキストビューのフォントのサイズを縮小する非推奨の方法を見つけようとしています。

メソッド「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;
}
17
JimmyJammed

解決策1

sizeWithFont: constrainedToSize:を:に置き換えるだけで問題を解決できます。

boundingRectWithSize:CGSizeMake(newView.frame.size.width, FLT_MAX)
                options:NSStringDrawingUsesLineFragmentOrigin
             attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Interstate" size:fontSize]}
                context:nil];

解決策2

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つがあなたの問題を解決することを願っています。乾杯!

21
aksh1t

同じことをしなければなりませんでしたが、プログラムで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];
_
4
bicycle

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;

}
1
mj_jimenez

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]がなくてもうまくいくでしょう。

1
Eugene Dudnyk

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)
0
Corey Pett