让UILabel(多行显示,指定宽度,获取高度)

现在感觉很困,为了提请精神写篇博客记录下希望是个好的开始。项目中有个“帮助页面”需要将接口传来的数据展示给用户,无非形式是:一问一答。数据是以json格式传过来的。本想简单起见用UILabel来展示,做完之后发现用html形式来处理更好。

接口数据:

让UILabel(多行显示,指定宽度,获取高度)_第1张图片

主要用到这个方法:– sizeWithFont:constrainedToSize:lineBreakMode:(可使用于UILabel,UITextView

参考了网上的方法,

1.Computing Metrics for a Single Line of Text

– sizeWithFont:同下面,换行方式默认取NSLineBreakByWordWrapping

– sizeWithFont:forWidth:lineBreakMode: 将字符串放入指定宽度,如果不够,就依据换行方式截断字符串,返回其大小。

sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:将字符串放入限定宽度内,不足,就缩小字体,直至放下,返回此时的字符串大小和字体大小;缩小到最小还不能放下,就截断字符串,返回其大小和字体大小。设置高度没有什么意义,因为高度值再大也只能显示一行,再小也要显示一行。

2.Computing Metrics for Multiple Lines of Text
sizeWithFont:constrainedToSize: 同下面,换行方式默认取NSLineBreakByWordWrapping

sizeWithFont:constrainedToSize:lineBreakMode:用于多行,指定限制,换行方式,字体大小。限制大小的宽度值和换行方式影响换行,进而影响结果的高度值。限制大小的高度值会影响内容显示的多少,大于实际所需,没影响;小于的话,字符串只能显示一部分,直至只能显示一行.

注意:指定的限制只是一个评估值,例如在多行里,我设定宽度限制120,高度无限,换行方式NSLineBreakByWordWrapping,那么最终输出的宽度值是118。因为对于某个字体大小,它不会刚好填满你指定的宽度。此外,除了– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:会改变字体大小的情况外,字体大小指定时,无论换行方式如何,是多行还是单行,最终的高度都是和字体所需的高度成1倍或者n倍关系

项目中的代码:

//根据label的内容多少自动调整label的Frame(多行显示,指定宽度,获取高度 )
- (void)loadContent{
    
    for (int i = 0; i < [self.contentArr count]; i ++) {
        //接口传来的数据不用管
        NSString *text = [[self.contentArr objectAtIndex:i] valueForKey:@"title"];
        NSString *content = [[self.contentArr objectAtIndex:i] valueForKey:@"content"];
      
        UIFont *font = [UIFont boldSystemFontOfSize:19.0f];  //问题字体
        UIFont *contentFont = [UIFont systemFontOfSize:15]; //答案字体
        
        CGSize maxSize = CGSizeMake(280.0f, MAXFLOAT); //label可设置的最大高度和宽度
        
         //字符串在指定区域内按照指定的字体大小显示,需要的高度和宽度(宽度在字符串只有一行时有用)
        //一般用法:指定区域的宽度而高度用MAXFLOAT,则返回值包含对应的高度
        //如果指定了显示区域的宽度,而字符串要显示的区域的高度超过了指定区域的高度,则高度返回0
        CGSize labelSize = [text sizeWithFont:font constrainedToSize:maxSize lineBreakMode:NSLineBreakByWordWrapping];
        CGSize ContentSize = [content sizeWithFont:contentFont constrainedToSize:maxSize lineBreakMode:NSLineBreakByWordWrapping];
        
        //标题和答案要显示区域
        CGRect rect = CGRectMake(10, self.height +10, labelSize.width, labelSize.height);
        self.height += CGRectGetHeight(rect)+14; //用于处理接口传来的多个问答
        CGRect contentRect = CGRectMake(10, self.height, ContentSize.width, ContentSize.height);
        self.height += CGRectGetHeight(contentRect) +4;
        
        UILabel *label = [[UILabel alloc]initWithFrame:CGRectZero];
        UILabel *labelContent = [[UILabel alloc]initWithFrame:CGRectZero];
        [label setNumberOfLines:0];  //label默认只显示一行,把numberofline设为0,即表示不限制行数,根据实际显示
        [labelContent setNumberOfLines:0];
        
        label.frame = rect;
        labelContent.frame = contentRect;

        label.text = text;
        label.font = font;
        label.backgroundColor = [UIColor clearColor];
        
        labelContent.text = content;
        labelContent.font = contentFont;
        labelContent.backgroundColor = [UIColor clearColor];
        
        [self.scrollView addSubview:label];
        [self.scrollView addSubview:labelContent];
        
        [label release];
        [labelContent release];
        
        //当self.height的值大于scrollView的高度时设置scrollView的contentSize,让scrollView可以滑动
        if (CGRectGetHeight(self.scrollView.frame) < self.height) {
            self.scrollView.contentSize = CGSizeMake(CGRectGetWidth(_scrollView.frame),self.height + 40);
        }
    }
}
让UILabel(多行显示,指定宽度,获取高度)_第2张图片

你可能感兴趣的:(让UILabel(多行显示,指定宽度,获取高度))