2017-02-04 30 views
2

Когда я пытаюсь добавить атрибуты к атрибутной строке, содержащей emojis, иногда некоторые из emojis сломаны. Для обычного текста работает отлично. Любые идеи, что я делаю неправильно?Добавление атрибутов в строку с emojis breaks some emojis

Вот моя функция - она ​​должна смелые цитаты (текст между первой и последней кавычку)

func boldQuotation(str: String, fontSize: CGFloat) -> NSAttributedString { 
    let normalAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(fontSize)] 
    let boldAttributes = [NSFontAttributeName : UIFont.boldSystemFontOfSize(fontSize)] 
    let attributedStr = NSMutableAttributedString(string: str, attributes: normalAttributes) 

    let firstQuotationMarkRange = str.rangeOfString("\"") 
    let lastQuotationMarkRange = str.rangeOfString("\"", options: [.BackwardsSearch], range: nil, locale: nil) 
    guard let firstIndex = firstQuotationMarkRange?.startIndex, lastIndex = lastQuotationMarkRange?.endIndex else { 
     return attributedStr 
    } 
    attributedStr.addAttributes(boldAttributes, range: NSMakeRange(str.startIndex.distanceTo(firstIndex), firstIndex.distanceTo(lastIndex))) 
    return attributedStr 
} 

Вот образец текста, который не может быть правильно отнести:

let str = "\"\"" 

результат выглядит как это:

enter image description here

Я использую Swift 2.3, iOS 10.2.1, Xcode 8.2.1, Цель развертывания: 9.3

ответ

0

Хорошо, после дальнейшего расследования (и ответа нет) я наконец нашел причину и решение этой ошибки.

При создании NSRange возникли проблемы с использованием Range (полученных от String). Короткий длинный рассказ - Swift String диапазоны и NSString диапазоны не должны использоваться для преобразования одного в другое. По крайней мере, не так:

let firstQuotationMarkRange  = str.rangeOfString("\"") 
let lastQuotationMarkRange  = str.rangeOfString("\"", options: [.BackwardsSearch], range: nil, locale: nil) 
guard let firstIndex = firstQuotationMarkRange?.startIndex, lastIndex = lastQuotationMarkRange?.endIndex else { 
     return attributedStr 
    } 
//THIS IS WRONG: 
range = NSMakeRange(str.startIndex.distanceTo(firstIndex), firstIndex.distanceTo(lastIndex)) 

Итак, какое правильное решение? Сначала конвертируйте String в NSString, а затем начните поиск подстроки. Здесь фиксируется функция:

func boldQuotation(str: String, fontSize: CGFloat) -> NSAttributedString { 
    let normalAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(fontSize)] 
    let boldAttributes = [NSFontAttributeName : UIFont.boldSystemFontOfSize(fontSize)] 
    let attributedStr = NSMutableAttributedString(string: str, attributes: normalAttributes) 

    let nsStr = str as NSString 
    let firstQuotationMarkRange = nsStr.rangeOfString("\"") 
    let lastQuotationMarkRange = nsStr.rangeOfString("\"", options: [.BackwardsSearch]) 
    guard firstQuotationMarkRange.length > 0 && lastQuotationMarkRange.length > 0 else { 
     return attributedStr 
    } 
    let nsrange = NSMakeRange(firstQuotationMarkRange.location, lastQuotationMarkRange.location + lastQuotationMarkRange.length - firstQuotationMarkRange.location) 
    attributedStr.addAttributes(boldAttributes, range: nsrange) 
    return attributedStr 
} 

решаемые благодаря этому сообщению: NSRange from Swift Range

 Смежные вопросы

  • Нет связанных вопросов^_^