很多时候我需要计算UIlabel的动态高度,但是往往不注意细节就会出现计算不正确,为什么呢,因为UIlabel的text值有很多空字符,甚至占据了一行,所以开发时设计下一个控件的frame的时候,如果是基于text的高度来的话,那不好意思,你会发现你的下一个控件相距很大。
首先 介绍下UIlabel的换行以及怎样计算动态高度
计算字符串的高度
NSString *contentStr = @"不哈市的飞机还是东湖城市的本科成绩不俗额风格和分布基本法ALEDHOASEDH";
CGSize contentSize = [content sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:CGSizeMake(100, 100)];
----------
不好意思,你会发现让人烦恼的小黄标
API说了,这些方法在7.0以上就不能用了,具体看下面:
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:") __TVOS_PROHIBITED; // Uses NSLineBreakModeWordWrap
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:") __TVOS_PROHIBITED; // NSTextAlignment is not needed to determine size
计算区域内的字符串方法
NSString *contentStr = @"不哈市的飞机还是东湖城市的本科成绩不俗额风格和分布基本法ALEDHOASEDH";
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSFontAttributeName] = font;
CGSize maxSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
CGSize contentSize [contentStr boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
/**
* 参数解释
*
* @param Size 在规定的区域计算字符串的高度
* @param options
* NSStringDrawingUsesLineFragmentOrigin
* 指定的原点是线的片段原点,而不是基线原点
* NSStringDrawingUsesFontLeading
* 使用字体,以计算线的高度
* NSStringDrawingUsesDeviceMetrics
* 利用图像符号界而不是印刷字体
* NSStringDrawingTruncatesLastVisibleLine
* 削加省略字符到最后一行如果文本不适合的范围规定。如果nsstringdrawinguseslinefragmentorigin不是也忽略
* @param attributes 字体属性
* NSFontAttributeName
注意:计算的字体一样要跟控件的字体一一对应,否则你永远算不出来
好像没有说到重点,那好问题来了,如果是自己设置的字符串,那就毫无疑问计算出正确的高度了,但是如果从服务器获取的参数,或者被人传递给你的参数,你就不能保证没有空字符,很多人说判断一下,是,也是正确的方法,但是万一前后也有呢。
很多时候出现的情况是这样的
别看了,就是有空字符
好了,解决方法在这里
NSString * content = @"传递的参数";
content = [content stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //去除掉首尾的空白字符和换行字符
content = [content stringByReplacingOccurrencesOfString:@"\r" withString:@""];
content = [content stringByReplacingOccurrencesOfString:@"\n" withString:@""];
取出空的字符和换行符,就能计算出正确的高度了。
另外注意的是:
去除空字符,要两个地方,一是你的参数值,二是参数值算出的高度并设置控件的frame