5

私は試しましたがsizeWithFont:constrainedToSize:lineBreakModesizeToFitどちらも正しい結果を返しません。

プロパティcontentSizeは正しい高さを返すはずですが、テキストビューが画面にレンダリングされるまで機能しません。テキストビューが表示される前に高さを計算する必要があります(これにより、の高さが決まりUITableViewCellます。

UITextViewの高さを正しく計算する他のメソッド、カスタムテキストビューなどを見つけた人はいますか?

編集 テキストビューのコンテンツに基づいて理想的な高さが必要であることを明確にする必要があります。

4

4 に答える 4

0

これが私のために働いたコードです:

+ (CGFloat)heightOfComment:(NSString *)comment {
    UILabel *label = PrototypeCell.commentLabel;

    // NOTE: The height of the comment should always be at least the height of
    //       one line of text.
    if (comment.length == 0)
        comment = @" ";

    return [comment sizeWithFont:label.font
               constrainedToSize:label.frame.size
                   lineBreakMode:label.lineBreakMode].height;    
}

それを機能させるための鍵はでしたif (comment.length == 0) comment = @" ";

于 2012-05-14T18:09:55.897 に答える
0

sizeToFit: と layouSubview を含むテクニックが機能しない場合、私はこれを使用します:

- (CGFloat)measureHeightOfUITextView:(UITextView *)textView
{
    if ([textView respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)])
    {
        // This is the code for iOS 7. contentSize no longer returns the correct value, so
        // we have to calculate it.
        //
        // This is partly borrowed from HPGrowingTextView, but I've replaced the
        // magic fudge factors with the calculated values (having worked out where
        // they came from)

        CGRect frame = textView.bounds;

        // Take account of the padding added around the text.

        UIEdgeInsets textContainerInsets = textView.textContainerInset;
        UIEdgeInsets contentInsets = textView.contentInset;

        CGFloat leftRightPadding = textContainerInsets.left + textContainerInsets.right + textView.textContainer.lineFragmentPadding * 2 + contentInsets.left + contentInsets.right;
        CGFloat topBottomPadding = textContainerInsets.top + textContainerInsets.bottom + contentInsets.top + contentInsets.bottom;

        frame.size.width -= leftRightPadding;
        frame.size.height -= topBottomPadding;

        NSString *textToMeasure = textView.text;
        if ([textToMeasure hasSuffix:@"\n"])
        {
            textToMeasure = [NSString stringWithFormat:@"%@-", textView.text];
        }

        // NSString class method: boundingRectWithSize:options:attributes:context is
        // available only on ios7.0 sdk.

        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];

        NSDictionary *attributes = @{ NSFontAttributeName: textView.font, NSParagraphStyleAttributeName : paragraphStyle };

        CGRect size = [textToMeasure boundingRectWithSize:CGSizeMake(CGRectGetWidth(frame), MAXFLOAT)
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:attributes
                                                  context:nil];

        CGFloat measuredHeight = ceilf(CGRectGetHeight(size) + topBottomPadding);
        return measuredHeight;
    }
    else
    {
        return textView.contentSize.height;
    }
}
于 2013-10-21T11:45:11.753 に答える
-2

UITextview がレイアウトされるまで、高さは使用できません。iOS 6 では、addSubview (たとえば、UIScrollView に) によってレイアウト値 (つまり、frame.size.height) が与えられました。iOS 7 では、これは常に発生するとは限りません。sizeToFit の場合も同様です。

私はいくつかの解決策を見つけました.sizeToFitを行い、次にlayoutIfNeededを(現在変更された)高さを読み取る前に行う方が好きです:

...
[scrollView1 addSubview: myTextView];

    [myTextView sizeToFit]; //added
    [myTextView layoutIfNeeded]; //added

CGRect frame = myTextView.frame;
...

これは、ここで受け入れられた回答からのものです。メモを参照してください。ここで説明しようとしているのは、(何らかの理由で) UIScrollViews ではなく UITableViewCells に追加された UITextviews に対してこれが有効でない場合です。

于 2013-10-21T11:18:26.043 に答える