iOS NSString 没有去除首尾空格,换行符,空字符--导致UIlabel不能正确计算换行后的动态高度

很多时候我需要计算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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值