这个问题已被多次询问,但反复给出的两三个答案似乎不起作用。
问题是:一个包含一些任意文本的`UITextView。在执行某些操作后,UITextView需要水平和垂直调整大小以适合文本。
其他问题的答案给出的值似乎与文本的宽度/高度大致相同;但是,当UITextView
调整为计算出的大小时,它不是很正确,并且文本行中断与最初不同。
建议的方法包括使用– sizeWithFont:constrainedToSize:
和其他NSString方法,UITextView的sizeThatFits:
方法(这给出了更正确的高度,但是视图的整个宽度),以及contentSize
文本视图的属性(也给出了错误的宽度)。
是否有准确的方法来确定UITextView
文字的宽度?或者文本视图中是否有一些隐藏的填充,使文本适合的实际宽度更小?或者其他我完全失踪的东西?
答案 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;
}