问题1:UILabel 的 lineBreakMode
当我们在给UILabel赋值字符串的时候,如果字符串是中英文组合,那么就可能出现中文和英文“断截”换行的情况,解决方法就是设置 lineBreakMode,下面是这个属性的解释:
NSLineBreakByWordWrapping = 0, // 默认根据“单词”来换行,也就是label会默认认为一串连续的英文是一个单词,大家可以在上面string中字母部分中间插入一个空格,会发现界面就会发生改变
NSLineBreakByCharWrapping, // 只根据换行符换行,所有字符会依次排满label整行后才会另起一行
NSLineBreakByClipping, // 当文字过多的时候,label 会直接切除多余的文字不显示省略号
NSLineBreakByTruncatingHead, // 当文字过多的时候,label 会省略最前面的部分作为 省略号
NSLineBreakByTruncatingTail, // 当文字过多的时候,label 会省略最后面的部分作为 省略号
NSLineBreakByTruncatingMiddle
问题2:UILabel计算文字高度
UILabel中的文字高度计算在iOS7.0之后系统提供了一个方法boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(nullable NSStringDrawingContext *)context
,其实文字高度计算不准确大多是因为options参数设置不准确导致的,正确的设置方法应该是这样的:NSStringDrawingOptions option = NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
,顺便附上计算高度的方法实现,这里是写在NSString的分类中的:
- (CGSize)textSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
{
CGSize textSize;
if (CGSizeEqualToSize(size, CGSizeZero))
{
NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
textSize = [self sizeWithAttributes:attributes];
}
else
{
NSStringDrawingOptions option = NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
//NSStringDrawingTruncatesLastVisibleLine如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。 如果指定了NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略 NSStringDrawingUsesFontLeading计算行高时使用行间距。(字体大小+行间距=行高)
NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
CGRect rect = [self boundingRectWithSize:size
options:option
attributes:attributes
context:nil];
textSize = rect.size;
}
return textSize;
}
经过测试,就算是文字中含有换行符,中英文组合也可以准确的计算高度,【具体效果见demo】
问题3:UILabel设置了富文本 之后对齐方式失效
一次偶然的机会,我在做富文本效果的时候,设置了行间距,发现之前设置的UILabel的对齐方式不起作用了,于是我在设置富文本之后再次设置了一遍对齐方式,这才将页面效果显示正确,不过这种情况,在不设置行间距的情况下是不会出现的,也就是说,先设置对齐方式,在设置没有行间距富文本,对齐方式依然有效,具体原因我暂时不清楚,文档上也没有相关的说明
【具体效果见demo】