NSLayoutManager limitingRectForGlyphRange off por algunos puntos

Quiero "resaltar" palabras específicas en UITextView, no con un color sólido (que sería posible a través deNSAttributedString), sino más bien con un degradado y tal vez algunos otros efectos de fantasía.

Por lo tanto, decidí que sería necesario crear manualmente una vista y superponerla (o superponerla) utilizando los rectángulos delimitadores del texto dado.

Para mi sorpresa, esto resultó ser bastante sencillo. El ejemplo está dentro de un UIViewController,txtView ser unUITextView conectado comoIBOutlet:

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)
}

Lamentablemente, esto lleva a la vista general (en rojo en la captura de pantalla a continuación), que se aleja por algunos puntos.

Siempre parece estar apagado por la misma cantidad. Lo que significaría que probablemente podría codificar, pero eso nunca ha sido una buena idea. Probé esto en Simulator con varios dispositivos y en un iPhone 6 con iOS 8.1.3.

También probé otras variaciones (creando mi propio NSTextContainer, etc.) inspirado enla pregunta sobre cómo obtener un CGRect para una subcadena y"boundingRectForGlyphRange no siempre funciona para todas las cadenas"

Cualquier idea (ademásrecurriendo a CoreText)?

Respuestas a la pregunta(1)

Su respuesta a la pregunta