3

この質問は何度も出されていますが、繰り返し出された 2 つまたは 3 つの回答はうまくいかないようです。

問題は次のとおりです。任意のテキストを含む `UITextView。なんらかのアクションの後、UITextView は水平方向と垂直方向の両方のサイズを変更して、テキストがぴったりと収まるようにする必要があります。

他の質問に対する回答は、テキストの幅/高さとほぼ同じに見える値を示します。ただし、UITextViewが計算されたサイズにサイズ変更されると、正確ではなく、テキストの改行が元とは異なります。

推奨される方法には– sizeWithFont:constrainedToSize:、その他の NSString メソッドの使用sizeThatFits:、UITextView の方法 (これにより、より正確な高さが得られますが、ビューの全幅が得られます)、およびcontentSizeテキスト ビューのプロパティ (これも間違った幅が得られます) が含まれます。

UITextViewのテキストの幅を正確に決定する方法はありますか? または、テキストビューに隠されたパディングがあり、テキストが実際に収まる幅が小さくなりますか? または、私が完全に見逃している何か他のものはありますか?

4

1 に答える 1

0

I noticed the same problem: - sizeWithFont:constrainedToSize: on NSString will use different line breaks than a UITextView of the same width.

Here is my solution, though I'd like to find something cleaner.

    UITextView *tv = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, myMaxWidth, 100)]; // height resized later.
    tv.font = myFont;
    tv.text = @"."; // First find the min height if there is only one line.
    [tv sizeToFit];
    CGFloat minHeight = tv.contentSize.height;
    tv.text = myText; // Set the real text
    [tv sizeToFit];
    CGRect frame = tv.frame;
    frame.size.height = tv.contentSize.height;
    tv.frame = frame;
    CGFloat properHeight = tv.contentSize.height;
    if (properHeight > minHeight) { // > one line
        while (properHeight == tv.contentSize.height) {
            // Reduce width until height increases because more lines are needed
            frame = tv.frame;
            frame.size.width -= 1;
            tv.frame = frame;
        }
        // Add back the last point. 
        frame = tv.frame;
        frame.size.width += 1;
        tv.frame = frame;
    }
    else { // single line: ask NSString + fudge.
        // This is needed because a very short string will never break 
        // into two lines.
        CGSize tsz = [myText sizeWithFont:myFont constrainedToSize:tv.frame.size];
        frame = tv.frame;
        frame.size.width = tsz.width + 18; // YMMV
        tv.frame = frame;
    }
于 2013-01-23T06:10:27.380 に答える