我在项目中的要求是UITextView
的字体大小应根据UITextView
的内容减少。所以我想用boundingRectWithSize
来估算文本的大小。
问题是我得到的字体大小有点太大,文本的某些部分会被剪裁。
我的功能:
-(BOOL)updateTextViewFontSizeForText:(NSString*)text{
float fontSize = self.maximumFontSizeInPoints;
self.font = [self.font fontWithSize:fontSize];
CGSize tallerSize ;
CGSize stringSize ;
do
{
if (fontSize <= self.minimumFontSizeInPoints) // it just won't fit
return NO;
fontSize -= 1.0;
self.font = [self.font fontWithSize:fontSize];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
NSDictionary *attributes = @{ NSFontAttributeName: self.font, NSParagraphStyleAttributeName : paragraphStyle };
tallerSize = CGSizeMake(self.frame.size.width,self.frame.size.height-16);// the 16 is given because uitextview adds some offset
stringSize = [text boundingRectWithSize:CGSizeMake(self.contentSize.width,CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;
}while(stringSize.height >= tallerSize.height);
if ([self.onTextChangDelegate respondsToSelector:@selector(onTextChangDelegate)]) {
[self.onTextChangDelegate onTextChanged:text];
}
return YES;
}
答案 0 :(得分:6)
我在尝试做同样的事情时遇到了同样的问题。
问题是UITextView
与boundingRectWithSize相比如何运行其换行符。您可以在此处阅读更多详细信息:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TextLayout/Concepts/CalcTextLayout.html
但你可以实际计算确切的大小! UITextView
基本上有两个属性,您需要考虑这些属性才能获得正确的大小估算值。第一个是textContainer.lineFragmentPadding
,第二个是textContainerInset
。
首先,textContainer.lineFragmentPadding
:您可能已经注意到您的大小调整通常始终是10px
,这是因为系统默认值为5px
。当您计算估算的尺寸时,您需要从您要检查的尺寸中减去此值,并在获得最终价值时将其重新添加。
其次,textContainerInset
。这是UIEdgeInset
,您需要将其添加回最终计算值以匹配系统。
这是基于我如何解决问题的代码:
- (CGSize)sizeThatFits:(CGSize)size
CGFloat lineFragmentPaddings = self.textContainer.lineFragmentPadding * 2;
CGFloat horzPadding = self.textContainerInset.left + self.textContainerInset.right + lineFragmentPaddings;
CGFloat vertPadding = self.textContainerInset.top + self.textContainerInset.bottom;
size.width -= horzPadding;
CGRect boundingRect = [attributedText boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin context:nil];
size = boundingRect.size;
// I found through debugging that adding 0.25 rounded
// matches sizeThatFits: identically. Not sure why…
size.width += horzPadding + 0.25;
size.height += vertPadding + 0.25;
size = CGSizeRound(size);
return size;
}
注意,CGSizeRound
只是我编写的一个自定义函数,它将width
的{{1}}和height
四舍五入到最近的CGSize
。
为了进行比较,如果您创建第二个0.5
,并确保UITextView
和textContainer.lineFragmentPadding
相同,则应该看到几乎与最近的{{1}相同的值}。
关于计算正确pointSize的问题,这是一些伪代码:
textContainerInset
同样,以上是基于我的实现的伪代码(并不意味着只是替换你所拥有的)。希望这有帮助!
答案 1 :(得分:0)
试试这个
UITextView *textViewObj;//initialise textview.
textViewObj.autoresizesSubviews = NO;
textViewObj.autoresizingMask = UIViewAutoresizingNone;
答案 2 :(得分:0)
这确实在swift中工作,获得textview的原始高度..试试这个 让
size = cellQueue.contentLbl.sizeThatFits(CGSizeMake(cellQueue.contentLbl.frame.size.width,CGFloat(MAXFLOAT))) cellQueue.heightConstraintContentLbl.constant = size.height