UILabel的一些小问题

问题1:UILabel 的 lineBreakMode
当我们在给UILabel赋值字符串的时候,如果字符串是中英文组合,那么就可能出现中文和英文“断截”换行的情况,解决方法就是设置 lineBreakMode,下面是这个属性的解释:

NSLineBreakByWordWrapping = 0,      // 默认根据“单词”来换行,也就是label会默认认为一串连续的英文是一个单词,大家可以在上面string中字母部分中间插入一个空格,会发现界面就会发生改变
     NSLineBreakByCharWrapping,     // 只根据换行符换行,所有字符会依次排满label整行后才会另起一行
     NSLineBreakByClipping,     // 当文字过多的时候,label 会直接切除多余的文字不显示省略号
     NSLineBreakByTruncatingHead,   // 当文字过多的时候,label 会省略最前面的部分作为 省略号
     NSLineBreakByTruncatingTail,   // 当文字过多的时候,label 会省略最后面的部分作为 省略号
     NSLineBreakByTruncatingMiddle

【具体效果见demo】

问题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】

你可能感兴趣的:(UILabel的一些小问题)