UITextView调整宽度以适合文本

时间:2012-08-09 20:49:37

标签: objective-c ios text uitextfield

这个问题已被多次询问,但反复给出的两三个答案似乎不起作用。

问题是:一个包含一些任意文本的`UITextView。在执行某些操作后,UITextView需要水平和垂直调整大小以适合文本。

其他问题的答案给出的值似乎与文本的宽度/高度大致相同;但是,当UITextView调整为计算出的大小时,它不是很正确,并且文本行中断与最初不同。

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

是否有准确的方法来确定UITextView文字的宽度?或者文本视图中是否有一些隐藏的填充,使文本适合的实际宽度更小?或者其他我完全失踪的东西?

1 个答案:

答案 0 :(得分:0)

我注意到同样的问题:NSString上的- sizeWithFont:constrainedToSize:将使用与相同宽度的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;
    }