感谢两位@八条8tiao 和@SAW 两位大神提醒,内容又完善了下,加了下注释。注释内容是自己理解的,如果有错的地方,还请路过大神不吝赐教!
最近在做的项目中需要textView的文字内容居中。以为很简单,一句代码或者在xib中简单设置就可以搞定的事情,结果远比想象中的难。网上找了好多方法,要么太复杂,要么根本不好使。结果找到这位大神的方法,简单易用、效果还好,贴上来分享给大家:
- (void)contentSizeToFit
{
//先判断一下有没有文字(没文字就没必要设置居中了)
if([self.textView.text length]>0)
{
//textView的contentSize属性
CGSize contentSize = self.textView.contentSize;
//textView的内边距属性
UIEdgeInsets offset;
CGSize newSize = contentSize;
//如果文字内容高度没有超过textView的高度
if(contentSize.height <= self.textView.frame.size.height)
{
//textView的高度减去文字高度除以2就是Y方向的偏移量,也就是textView的上内边距
CGFloat offsetY = (self.textView.frame.size.height - contentSize.height)/2;
offset = UIEdgeInsetsMake(offsetY, 0, 0, 0);
}
else //如果文字高度超出textView的高度
{
newSize = self.textView.frame.size;
offset = UIEdgeInsetsZero;
CGFloat fontSize = 18;
//通过一个while循环,设置textView的文字大小,使内容不超过整个textView的高度(这个根据需要可以自己设置)
while (contentSize.height > self.textView.frame.size.height)
{
[self.textView setFont:[UIFont fontWithName:@"Helvetica Neue" size:fontSize--]];
contentSize = self.textView.contentSize;
}
newSize = contentSize;
}
//根据前面计算设置textView的ContentSize和Y方向偏移量
[self.textView setContentSize:newSize];
[self.textView setContentInset:offset];
}
}
原理:由于textView是继承自UIScrollview,所以会有ContentSize属性。所以可以通过文字内容的高度(也就是ContentSize)的高度和textView的高度之间的差值,设置内边距,就相当于把内容居中了。