UITextView 调整宽度以适合文本
Posted
技术标签:
【中文标题】UITextView 调整宽度以适合文本【英文标题】:UITextView Resize Width to Fit Text 【发布时间】:2012-08-09 20:49:36 【问题描述】:这个问题已经被问过无数次了,但反复给出的两三个答案似乎都不起作用。
问题是:一个 `UITextView 包含一些任意文本。一些操作后,UITextView 需要调整水平和垂直大小以紧贴文本。
其他问题的答案给出的值似乎与文本的宽度/高度大致相同;但是,当 UITextView
调整为计算出的大小时,它并不完全正确,并且文本换行符与原来不同。
建议的方法包括使用– sizeWithFont:constrainedToSize:
和其他NSString 方法,UITextView 的sizeThatFits:
方法(这给出了更正确的高度,但视图的全宽),以及文本视图的contentSize
属性(也给出了错误的宽度)。
是否有准确的方法来确定UITextView
的文本宽度?或者文本视图中是否有一些隐藏的填充使文本适合的实际宽度更小?还是我完全想念的其他东西?
【问题讨论】:
出于好奇,如果您使用 sizeWithFont 方法,结果会有多远? UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 20, 300, 200)]; textView.font = [UIFont systemFontOfSize:10.0f]; CGSize textViewSize = [textView.text sizeWithFont:[UIFont systemFontOfSize:10.0f] constrainedToSize:CGSizeMake(textView.frame.size.width - (textView.contentInset.left + textView.contentInset.left), MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap]; 很难准确地说,因为我没有正确的数字来比较它。内容插图全部为零。返回的大小 b sizeWithFont 太小,所以它增加了额外的中断。如果我增加设置文本视图的宽度 [textView.text sizeWithFont:font constrainedToSize:textView.frame.size]+fudge,16 似乎始终是给出正确大小的幻数。但是,如果文本在单词中间而不是空格处中断,那将不起作用。在这种情况下 sizeWithFont 是正确的。 也许 sizeWithFont 没有考虑空格字符,但会影响每行如何适合 uiTextView? 【参考方案1】:我注意到了同样的问题: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;
【讨论】:
以上是关于UITextView 调整宽度以适合文本的主要内容,如果未能解决你的问题,请参考以下文章
如何调整 UITextField 占位符文本以适合 UITextField 宽度?
在GridView AutoGenerateColumns中调整列的宽度以使文本适合页面