NSLayoutManager boundingRectForGlyphRange um einige Punkte

Ich möchte bestimmte Wörter in UITextView "hervorheben", nicht einfarbig (was über @ möglich wäreNSAttributedString), sondern mit einem Farbverlauf und vielleicht einigen anderen ausgefallenen Effekten.

n diesem Fall habe ich beschlossen, dass eine Ansicht manuell erstellt und mit den Begrenzungsrechtecken des angegebenen Texts überlagert (oder unterlegt) werden muss.

Zu meiner Überraschung erwies sich dies als ziemlich einfach. Beispiel ist in einem UIViewController,txtView seinUITextView verbunden alsIBOutlet:

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

Leider führt dies dazu, dass die überlagerte Ansicht (im folgenden Screenshot rot) um einige Punkte abweicht.

Es scheint immer um den gleichen Betrag aus zu sein. Das würde bedeuten, dass ich wahrscheinlich hart codieren könnte, aber das war noch nie eine gute Idee. Getestet im Simulator mit verschiedenen Geräten und auf einem iPhone 6 mit iOS 8.1.3.

Ich habe auch andere Variationen ausprobiert (indem ich meinen eigenen NSTextContainer usw. erstellt habe), inspiriert vondie Frage, wie man ein CGRect für einen Teilstring bekommt und "boundingRectForGlyphRange funktioniert nicht immer für alle Zeichenfolgen"

Irgendwelche Ideen (außerResortierung zu CoreText)?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage