1. ホーム
  2. ios

iOS7 UITextView contentsize.height 代替案

2023-09-29 14:04:31

質問

iOS 6.1 から iOS 7 にアプリを移植しています。レイアウトを使用しており、そこには UITextView があり、その幅は固定ですが、高さはそのcontentsizeに基づきます。iOS 6.1ではcontentsize.heightをチェックして、それをテキストビューのフレームの高さとして設定すれば十分でしたが、iOS 7ではうまくいきません。

では、どのようにすれば UITextView を作成するにはどうしたらよいでしょうか。

注:これらのビューはInterface Builderではなく、コードから作成しています。

どのように解決するのですか?

以下のコードで、固定幅のUITextViewの高さを変更することができます(iOS 7およびそれ以前のバージョンで動作しています)。

- (CGFloat)textViewHeightForAttributedText:(NSAttributedString *)text andWidth:(CGFloat)width
{
    UITextView *textView = [[UITextView alloc] init];
    [textView setAttributedText:text];
    CGSize size = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)];
    return size.height;
}

この関数では、NSAttributedStringと固定幅を受け取り、必要な高さを返します。

特定のフォントのテキストからフレームを計算したい場合は、次のコードを使用する必要があります。

- (CGSize)text:(NSString *)text sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
{
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
        CGRect frame = [text boundingRectWithSize:size
                                          options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        return frame.size;
    }
    else
    {
        return [text sizeWithFont:font constrainedToSize:size];
    }
}

を追加することができます。 SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO として、プロジェクト内のprefix.pchファイルに追加してください。

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

また、先ほどのテストを置き換えることで SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) によって。

if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])‌