UILabel被砍头砍脚的那些事儿
前几天在使用国内顶尖的一个APP的时候,发现了一个很低级的错误。搜索出来的内容,显示的Label文字的头和尾巴都被切除了。具体是哪个APP我就不说了,但是你手机上肯定有。最后和他们的工程师提个这个问题,下个版本估计就修复了。
下面我们对UILabel的高度探讨一下:
如下图这样的问题:
我们可以看到“这是一个测试”的头部和尾部都被切了,这是因为他们工程师在设置UILabel的时候把height设置为和font相同的大小了。例如font为14,height也为14。有人会说,设置成相同的大小没有问题呀!这你就错了,因为你可能只测试过iOS8以上版本,当在iOS7中此bug就出现了。
iOS8上面的显示:
在iOS8上没有出现问题。
那么我们在设置Label高度的时候,应该设置为多少呢?这个问题需要系统来告诉我们。
CGSize size =[label.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]}];
NSLog(@"%f",size.height);
2015-08-14 11:07:19.949 LabelHeight[7535:86988] 16.702000
如图所示:不论在iOS7还是iOS8上面,系统计算出来的高度都是16.702000。
因此,我们平时尽量写好公共类,使用系统自动计算高度。如果想手动固定label的height的话,我们在font的基础上加3,也就是font为14,height就为17。
开发过程中一定要多测试几个模拟器,不同的模拟器bug是不可预见的。
以上内容是个人的见解,如有问题,欢迎朋友们批评指正,谢谢!
———————-2016年1月12日———————-
截止目前,这个应用还是这样,和技术人员联系,技术人员给我的答复是不能轻易改动。
多个人做一个应用,多了方便,少了情怀……
12 评论
而且你所谓的+3也是不行的,你最好看一下UIFont这个类的属性和文字绘制的原理。单纯的去校验数字是不能很好的适配字体大小的。
@xt 我文章有提到
CGSize size =[label.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]}];
这个系统的计算高度的方法没错吧?我只是提到“如果想手动固定label的height的话”,就+3保险
@ian 这个是系统提供的计算方法,但是有时也并不是那么合适。
你有没有发现过,用这个方法算出来的高度设置UILabel的高度时,UILabel的顶部和文字的顶部有段距离?
你说的这个App可能就是为了去掉这段距离而采取了一些措施导致UILabel被截断。
@xt 那这个有什么好的解决方案吗?在去掉空隙的时候保证不被截断
@ian 你试试这段代码。
继承于UILabel的子类,重写下面这两个方法。
– (void)drawTextInRect:(CGRect)rect{
CGFloat insetHeight = ceilf(self.font.lineHeight – self.font.pointSize);
rect = UIEdgeInsetsInsetRect(rect, UIEdgeInsetsMake(-insetHeight * 0.5, 0, -insetHeight * 0.5, 0));
return [super drawTextInRect:rect];
}
– (CGSize)intrinsicContentSize{
CGSize superSize = [super intrinsicContentSize];
CGFloat insetHeight = ceilf(self.font.lineHeight – self.font.pointSize);
superSize.height -= insetHeight;
return superSize;
}
@ian 你说的这是哪个App?
@xt 邮件已私信
这个你就想简单了,我推测这个问题不是你说的设置了label的高度为字体的size。
而是重写了UILabel的绘制方法,通过UIFont的属性,减去系统UILabel在绘制时顶部和底部的空白。这个方法不是随便能动的。
多了方便,少了情怀。。。深得我心。。。
@Calios 当把一个应用当做自己孩子的时候那是最用心的
@ian 就是这种感觉!像看着一个小baby一点点长大。。
分享您的想法?
撰写评论