Swift IOS: выделение указанного текста c в тексте - PullRequest
0 голосов
/ 14 февраля 2020

Я работаю с выделением определенного символа в данном тексте.

Вот мой рабочий код,

let titleLabel: UILabel!
let myText = "கொக்கு"
let textToHighlight = "க்"
titleLabel.frame = CGRect(origin: .zero, size: CGSize(width: 100, height: 100))
let textStroke: [NSAttributedString.Key : Any] = [
    .strokeColor : UIColor.white,
    .foregroundColor : UIColor.red,
    .strokeWidth : -2.0,
    ]
let textTitle = NSMutableAttributedString(string: myText)
let textHighlightRange = (myText as NSString).range(of: textToHighlight)
textTitle.addAttributes(textStroke, range: textHighlightRange)
titleLabel.attributedText = textTitle

Другие тексты, с которыми я работал, и получение ожидаемых результатов, но только Несколько слов, указывающих c на тамильских языках, с которыми я сталкиваюсь,

Другие языки Хорошо работали с текстом,

let myText = "MyText"
let textToHighlight = "T"

let myText = "मानक हिन्दी"
let textToHighlight = "न"

Проблемы с текстом

let myText = "கொக்கு"
let textToHighlight = "க்"

Поскольку я гуглил и получил немного подробностей по ссылке NSRange в строках, имеющих диалекты .

Но как найти методы () и advance (), используемые в данной ссылке , Я использую Xcode 11.2 и Swift версии 4

РЕДАКТИРОВАТЬ:

Через долгое время я нашел ближайшее решение для выделения / изменения цвета переднего плана моего совпадающего символа в текст, как показано ниже,

func characterToHighlight(text: String, highlight: String) -> NSAttributedString? {

    guard let match = try? NSRegularExpression(pattern: highlight, options: .caseInsensitive) else {
        return nil
    }

    let textStroke: [NSAttributedString.Key : Any] = [
    .strokeColor : UIColor.white,
    .foregroundColor : UIColor.red,
    .strokeWidth : -2.0,
    ]

    let attributedString = NSMutableAttributedString(string: text)
        match
        .matches(in: text, options: .withTransparentBounds,
        range: NSRange(location: 0, length: text.utf16.count))
        .forEach {
        attributedString.addAttributes(textStroke, range: $0.range)
        }

    return attributedString
}

if let matchedCharacter = characterToHighlight(text: text, highlight: textToHighlight){titleLabel.attributedText = matchedCharacter} 

Этот код работает для совпавших символов тамильских букв в строке, но передний план других букв был черным. Мне нужны несопоставленные символы синего цвета и соответствующие символы красного цвета.

Как этого добиться?

ОТВЕТ:

let titleLabel: UILabel!
let myText = "கொக்கு"
let textToHighlight = "க்"
titleLabel.frame = CGRect(origin: .zero, size: CGSize(width: 100, height: 100))
let textStroke: [NSAttributedString.Key : Any] = [
    .strokeColor : UIColor.white,
    .foregroundColor : UIColor.blue,
    .strokeWidth : -2.0,
    ]
let highlightTextAttributes: [NSAttributedString.Key : Any] = [
.strokeColor : UIColor.white,
.foregroundColor : UIColor.red,
.strokeWidth : -4.0,
]
let textTitle = NSMutableAttributedString(string: myText)
textTitle.addAttributes(textStroke, range: textHighlightRange)
if let matchedCharacterRange = getRange(text: text, highlight: textToHighlight)
{
    textTitle.addAttributes(highlightTextAttributes, range: matchedCharacterRange)
}
titleLabel.attributedText = textTitle


func getRange(text: String, highlight: String) -> NSRange? {

    guard let regex = try? NSRegularExpression(pattern: highlight, options: .caseInsensitive) else {
        return nil
    }

    var highlightRange: NSRange?

    regex
    .matches(in: text, options: .withTransparentBounds,
    range: NSRange(location: 0, length: text.utf16.count))
    .forEach {
        highlightRange = $0.range
    }
    return highlightRange
}

Я не могу опубликовать свой ответ отдельно, поэтому я редактирую свой вопрос и размещаю ответ в том же виде.

Эксперты, пожалуйста, просмотрите и исправьте меня, если я ошибаюсь.

Спасибо за ваша поддержка.

...