美文网首页iOS开发
iOS富文本设置混合字符串(中英文)奇葩换行问题

iOS富文本设置混合字符串(中英文)奇葩换行问题

作者: 念念不忘一个丫头的容 | 来源:发表于2020-07-14 15:07 被阅读0次

    今天遇到一个奇葩问题,一个多行显示的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;
        
    }
    

    相关文章

      网友评论

        本文标题:iOS富文本设置混合字符串(中英文)奇葩换行问题

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