iOS UILabel 设置内容的间距及高度的计算示例

2020-01-21 02:19:27于海丽

​ 3. NSStringDrawingUsesDeviceMetrics (将文字以图像符号计算文本占用范围,而不是以字符计算。也即是以每一个字体所占用的空间来计算文本范围 )
​ 4. NSStringDrawingTruncatesLastVisibleLine (当文本不能适合的放进指定的边界之内,则自动在最后一行添加省略符号。如果NSStringDrawingUsesLineFragmentOrigin没有设置,则该选项不生效)

参数3. context: 上下文,一般传nil

使用示例


NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
CGRect rect = [attributeString boundingRectWithSize:CGSizeMake(label.frame.size.width, CGFLOAT_MAX) options:options context:nil];

Label富文字计算高度注意点

出现问题

当文字只有一行并且是全是中文时:高度计算不准确

ios,UILabel,内容间距,设置间距,间距

解决思路

首先: 通过sizeThatFits 或 boundingWithRect 计算出未处理的rect值

第一步: 对rect值,进行判断: “是否只有一行 并且 该行文字全为中文”

第二步: 修复高度值,对高度值进行调整: “减去一个行间距值”

示例代码


//通过boundingWithRect 计算出未处理的rect值
 NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
 CGRect rect = [attributeString boundingRectWithSize:CGSizeMake(label.frame.size.width, CGFLOAT_MAX) options:options context:nil];

//判断内容是否只有一行 : (目前高度 - 字体高度) <= 行间距
 if ((rect.size.height - _font.lineHeight) <= paragraphStyle.lineSpacing){
//如果只有一行,进行判断内容中是否全部为汉字
  if ([self containChinese:string]) {
//修正后高度为: 目前高度 - 一个行间距
   rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height-paragraphStyle.lineSpacing);
  }
 }

//判断内容中是否全部为汉字
- (BOOL)containChinese:(NSString *)str {
  for(int i=0; i< [str length];i++){ int a = [str characterAtIndex:i];
   if( a > 0x4e00 && a < 0x9fff){ 
     return YES; 
   }
  }
  return NO;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU。


注:相关教程知识阅读请移步到IOS开发频道。