3

这个问题已经被问过无数次了,但反复给出的两三个答案似乎都不起作用。

问题是:包含一些任意文本的`UITextView。经过一些操作,UITextView 需要调整水平和垂直大小以紧贴文本。

其他问题的答案给出的值似乎与文本的宽度/高度大致相同;但是,当将UITextView调整为计算的大小时,它并不完全正确,并且文本换行符与原来的不同。

建议的方法包括 using– sizeWithFont:constrainedToSize:和其他 NSString 方法,sizeThatFits:UITextView 的方法(这给出了更正确的高度,但视图的全宽),以及contentSize文本视图的属性(也给出了错误的宽度)。

有没有一种准确的方法来确定 aUITextView的文本的宽度?或者文本视图中是否有一些隐藏的填充使文本适合的实际宽度更小?还是我完全想念的其他东西?

4

1 回答 1

0

我注意到同样的问题:- sizeWithFont:constrainedToSize:在 NSString 上将使用与相同宽度的 UITextView 不同的换行符。

这是我的解决方案,但我想找到更清洁的东西。

    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 回答