今天遇到一个奇葩问题,一个多行显示的Lable,其中设置了Lable字体颜色有差异的富文本。
但是出现了一个奇怪的问题,就是当文本全是英文的显示正常,但是有中英文混合字符串的时候,这个Lable,中间就会莫名其妙的换行展示。
最会查资料发现了Lable一个lineBreakMode属性,
在使用富文本时应注意中英混合的情况,会使你的换行操作出现问题,因为很多编译器默认会计算当“中文”+“英文”后如果宽度大于设定的控件宽度时,会将中文后的英文直接换到第二行显示(即lineBreakMode的默认属性为NSLineBreakByWordWrapping),在Xcode中的控制台打印和coding的时候都会出现这个情况。
label.lineBreakMode = NSLineBreakByCharWrapping;以字符为显示单位显示,后面部分省略不显示。
label.lineBreakMode = NSLineBreakByClipping;剪切与文本宽度相同的内容长度,后半部分被删除。
label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字以……方式省略,显示尾部文字内容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle;中间的内容以……方式省略,显示头尾的文字内容。
label.lineBreakMode = NSLineBreakByTruncatingTail;结尾部分的内容以……方式省略,显示头的文字内容。
label.lineBreakMode = NSLineBreakByWordWrapping;以单词为显示单位显示,后面部分省略不显示。
解决方法:
设置label.lineBreakMode = NSLineBreakByCharWrapping;
如果此时你是即进行了富文本设定又对换行进行设定的话,记住先把换行操作的代码放到label.attributedText = .......代码之后,不然label.lineBreakMode = NSLineBreakByCharWrapping会失效。
设置之后显示正常了,但是计算这个文本高度的时候,计算的高度不准确了。
切记:计算高度的时候,段落样式加上这个属性,就可以计算高度
paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
-----------------附上高度宽度计算方法---------------
计算高度
+ (CGFloat)getTheStringHeight:(NSString *)string setFont:(CGFloat)font withWidth:(CGFloat)width
{
if (string == nil || [string isEqualToString:@""])
{
return 0;
}
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:string];
//段落
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
// [paragraphStyle setLineSpacing:pageWidth];
// paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
NSRange range = NSMakeRange(0, attrStr.length);
[attrStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:range];
//设置字体
[attrStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:font]
range:range];
NSDictionary *dic = [attrStr attributesAtIndex:0 effectiveRange:&range]; // 获取该段
CGSize textSize = [string boundingRectWithSize:CGSizeMake(width, MAXFLOAT) // 用于计算文本绘制时占据的矩形块</span>
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本绘制时的附加选项
attributes:dic // 文字的属性
context:nil].size; // context上下文。包括一些信息,例如如何调整字间距以及缩放。该对象包含的信息将用于文本绘制。该参数可为nil
return textSize.height;
}
计算宽度
+ (CGFloat)getTheStringWidth:(NSString *)string setFont:(CGFloat)font withHeight:(CGFloat)height
{
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range = NSMakeRange(0, attrStr.length);
//设置字体
[attrStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:font]
range:range];
NSDictionary *dic = [attrStr attributesAtIndex:0 effectiveRange:&range]; // 获取该段attributedString
CGSize textSize = [string boundingRectWithSize:CGSizeMake(MAXFLOAT, height) // 用于计算文本绘制时占据的矩形块
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本绘制时的附加选项
attributes:dic // 文字的属性
context:nil].size; // context上下文。包括一些信息,例如如何调整字间距以及缩放。该对象包含的信息将用于文本绘制。该参数可为nil
return textSize.width;
}
网友评论