NSLayoutManager boundingRectForGlyphRange от некоторых точек

Я хочу «выделить» определенные слова в UITextView, а не сплошным цветом (что было бы возможно черезNSAttributedString), но скорее с градиентом и, возможно, с некоторыми другими необычными эффектами.

Следовательно, я решил, что будет необходимо вручную создать представление и наложить (или наложить) его, используя ограничивающие прямоугольники данного текста.

К моему удивлению, это оказалось довольно просто. Пример находится внутри UIViewController,txtView бытьUITextView связано какIBOutlet:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Converting to NSString as I need a NSRange for glphyRangeForCharacterRange
    // (a normal String in Swift returns a Range)
    let charRange = (txtView.text as NSString).rangeOfString("dolor sit er elit")
    assert(charRange.location != NSNotFound, "Character Range could not be found.")

    let glyphRange = txtView.layoutManager.glyphRangeForCharacterRange(charRange,
        actualCharacterRange: nil)
    let glyphContainer = txtView.layoutManager.textContainerForGlyphAtIndex(glyphRange.location, effectiveRange: nil)
    let glyphRect = txtView.layoutManager.boundingRectForGlyphRange(glyphRange,
        inTextContainer: glyphContainer!)

    let highlightView = UIView(frame: glyphRect)
    highlightView.alpha = 0.3
    highlightView.backgroundColor = UIColor.redColor()
    txtView.addSubview(highlightView)
}

К сожалению, это приводит к тому, что наложенный вид (красным на скриншоте ниже) отключен на несколько пунктов.

Кажется, он всегда выключен на одну и ту же сумму. Что означало бы, что я мог бы жестко закодировать, но это никогда не было хорошей идеей. Протестировал это в симуляторе с различными устройствами и на iPhone 6 с iOS 8.1.3.

Я также пробовал другие варианты (создавая свой собственный NSTextContainer и т. Д.), Вдохновленныйвопрос о том, как получить CGRect для подстроки а также«boundingRectForGlyphRange не всегда работает для всех строк»

Любые идеи (кромеприбегая к CoreText)?

Ответы на вопрос(1)

Ваш ответ на вопрос