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