UILabel自适应

在iOS7.0以前,都是使用sizeWithFont:constrainedToSize:lineBreakMode:这个方法来获取文字的Size,然后通过改变UILabel的frame属性来自适应文字大小。但是在iOS7.0以后,这个方法已经被苹果废弃了,所以必须重新找一个替代的方法来完成UILabel的自适应。
现阶段我找到最好的一方法就是boundingRectWithSize: options:attributes:context:这个方法,下面通过一些简单的实例代码来说明这个方法的使用。

首先,创建一个UILabel

_label = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetWidth(self.view.bounds)/2 - 200/2, 300, 200, 20)];
_label.textAlignment = NSTextAlignmentLeft;
_label.backgroundColor = [UIColor greenColor];
_label.numberOfLines = 0; //必须设置的属性,否则UILabel只能显示一行
_label.font = [UIFont fontWithName:@"Arial" size:14.0]; //也是非常重要的属性,不设置可能会出现问题
[self.view addSubview:_label];

在设置UILabel的属性中,最重要的两个属性分别是numberOfLines和font。
首先说明第一个属性numberOfLines,根据苹果官方文档的解释,这个属性的作用主要是设置UILabel的最大行数,而默认值为1,也就是说,默认只能显示1行,如果要移除最大行数的限制,则将此属性的值设为0。所以,为了达到自适应文字的目的,必须将此属性的值设为0。
第二个属性font也是必须要设置的一个属性,但现在先说不这个的原因,先来看看如何实现UILabel的自适应。看下面这个代码片段

_string = @"测试的字符串,测试的字符串,测试的字符串,测试的字符串,测试的字符串,测试的字符串,测试的字符串";
_label.text = _string;
UIFont *font = [UIFont fontWithName:@"Arial" size:14.0];
NSDictionary *dic = @{NSFontAttributeName : font};
CGRect rect = [_string boundingRectWithSize:CGSizeMake(200, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
_label.frame = CGRectMake(_label.frame.origin.x, _label.frame.origin.y, _label.frame.size.width, rect.size.height);

上文提到过,用方法boundingRectWithSize: options:attributes: context:这个方法来获取文字的大小,要获取这个大小,就需要三个重要的属性。
第一个是size,这个size是一个宽和高的约束,也就是你的UILabel自适应不能超过的一个宽和高。例如你的文字算出是200x100的大小,如果你讲size设为{200, 50},那你的文字也会显示不完全。
第二个是options,这里一个提供了4个,分别是NSStringDrawingTruncatesLastVisibleLine, NSStringDrawingUsesLineFragmentOrigin,NSStringDrawingUsesFontLeading以及NSStringDrawingUsesDeviceMetrics。NSStringDrawingUsesLineFragmentOrigin是以文字所组成的矩形来计算出Rect,NSStringDrawingUsesDeviceMetrics和NSStringDrawingTruncatesLastVisibleLine则是按照每个字来计算,而NSStringDrawingUsesFontLeading则是按照字体间的行距来计算,这四个属性可以根据具体的需求组合使用。
第三个则是attributes,在这里我们只用了NSFontAttributeName,写到这里,就可以解释前文所提到的UILabel的font属性了。在计算文字大小的时候,boundingRectWithSize:options:attributes:context:的attribute必须有NSFontAttributeName这个key,否则文字会显示不全。而且,如果UILabel的font与此方法的font不一致,也可能会导致文字显示不全。为什么说可能呢,因为如果UILabel的font的大小小于attribute中font的大小,文字可以显示,而如果大于attribute中font的大小,则会出现文字显示不全的情况。需要注意的是,如果两个font的大小一致,但是使用的文字不是一种类型(例如一个是”Arial”,另一个是”Helvetica”),也可能会造成文字显示不全的情况。
到此,通过以上的代码就可以实现UILabel的自适应,当然由于UILabel是随着文字动态改变的,那么UILabel的改变就可能会需要对UI进行重新布局。因此,我们可能会需要重写setNeedsLayout这个方法,然后在根据文字大小重新设置UILabel的frame的时候,在调用setNeedsLayout这个方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值