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