美文网首页日常
UILabel的一些小问题

UILabel的一些小问题

作者: 东健FO_OF | 来源:发表于2017-08-27 13:10 被阅读425次

    问题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的一些小问题

        本文链接:https://www.haomeiwen.com/subject/ximbdxtx.html