美文网首页
Swift 设置富文本经常遇到的坑

Swift 设置富文本经常遇到的坑

作者: jsone | 来源:发表于2022-03-17 18:11 被阅读0次

一、引言

日常开发中使用富文本显示,我们经常会用到的两个方法,坑就在这里面😂


哈哈哈
/// 根据range指定范围添加富文本的某个属性值
open func addAttribute(_ name: NSAttributedString.Key, value: Any, range: NSRange)
/// 根据range指定范围添加富文本的若干个属性值
open func addAttributes(_ attrs: [NSAttributedString.Key : Any] = [:], range: NSRange)

二、发现问题

我们在使用这两个方法的时候,往往会先入为主的认为这两个方法中的参数range是根据字符串的count去计算的,然后如果刚好需求需要设置富文本的字符串包含Emoji表情,你会发现通过这两个方法设置完富文本的属性后,会突然显示出乱码。


富文本显示乱码

三、解决方法

经过反复的思考,发现之前也遇到过这个问题,就是设置包含Emoji表情的富文本会出现乱码,后来发现是range计算出错导致富文本设置属性出现乱码。其实,富文本的属性length是String转为NSString后取NSString的length,所以渲染范围range并不是根据字符串的count属性去计算,而是转NSString后的length计算的,emoji表情的String的count为1,NSString的length却为2,所以只要把字符或者字符串转NSString取length就可以了。

/// Character字符扩展添加计算属性
@inlinable var length: Int {
    String(self).length
}
/// String字符串扩展添加计算属性
@inlinable var length: Int {
    (self as NSString).length
}
/// 计算range方法
func ranges() -> [NSRange] {
    var ranges = [NSRange]()
    var index = 0
    for char in self {
        if char.isValid {
            if let range = ranges.last, range.location + range.length >= index {
                ranges.removeLast()
                ranges.append(NSRange(location: range.location, length: char.length + range.length))
            } else {
                ranges.append(NSRange(location: index, length: char.length))
            }
        }
        index += char.length
    }
    return ranges
}
富文本正常显示

相关文章

  • Swift 设置富文本经常遇到的坑

    一、引言 日常开发中使用富文本显示,我们经常会用到的两个方法,坑就在这里面? 二、发现问题 我们在使用这两个方法的...

  • 使用UITextView设置超链接

    遇到的坑坑坑 下面说下在使用UITextView设置超链接时遇到的坑。UITextView可以通过设置富文本的方式...

  • swift3.0迁移到Swift4.0的坑

    swift3.0迁移到Swift4.0的坑 1、Swift4中使用富文本报NSForegroundColorAtt...

  • iOS swift OC button 设置富文本

    开发中遇到了设置button富文本的需求,因为遇到的少;这里记录一下 由于目前是在用swift开发,随手记录一下s...

  • ios 使用富文本加载HTML

    富文本设置 \n替换 图片宽度设置 行间距设置 获取富文本的高度

  • Swift 小知识点记录

    字符串截取 Swift 中设置指定的圆角 富文本赋值 和OC类似,富文本要传入一个字典,这里举的例子是往一个 Bu...

  • swift-富文本属性设置的封装

    最近在做一个练习项目的时候,经常写到要设置富文本属性的地方,所以写了一个简单的封装,因为swift的字符下标采用的...

  • 富文本

    富文本的常用封装(NSAttributedString) 最近经常遇到关于富文本的一些需求,特此封装了几个常用的A...

  • swift笔记1

    1、swift富文本的处理 swift有时候需要对UILabel复制富文本,例如个别几个文字变颜色等,按照OC方式...

  • swift - 快速设置富文本的分类

    一. range和NSRange互相转换 二.NSMutableAttributedString快速添加属性 三....

网友评论

      本文标题:Swift 设置富文本经常遇到的坑

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