我需要找到我的UILabel我的性格位置(它有ParagraphLineSpacing和AttributedText具有多),定位在自定義的UILabel字符協調與attributedText
我有我的性格的指數,但現在我不能讓X和我的索引中的Y座標。
,我翻譯成我的雨燕3.1的代碼
func boundingRect(forCharacterRange range: NSRange) -> CGRect {
let textStorage = NSTextStorage(attributedString: self.attributedText!)
let layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
let textContainer = NSTextContainer(size: bounds.size)
textContainer.lineFragmentPadding = 0
layoutManager.addTextContainer(textContainer)
var glyphRange: NSRange
// Convert the range for glyphs.
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: glyphRange)
return layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
}
但不幸的是,我真的不能使用此代碼,因爲actualGlyphRange問NSRangePointer,不NSRange,所以我改變了我的翻譯代碼
func boundingRect(forCharacterRange range: NSRange) -> CGRect {
let textStorage = NSTextStorage(attributedString: self.attributedText!)
let layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
let textContainer = NSTextContainer(size: bounds.size)
textContainer.lineFragmentPadding = 0
layoutManager.addTextContainer(textContainer)
//var glyphRange: NSRange
let a = MemoryLayout<NSRange>.size
let pointer:NSRangePointer = NSRangePointer.allocate(capacity: a)
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: pointer)
return layoutManager.boundingRect(forGlyphRange: range, in: textContainer)
}
我不明白
var glyphRange: NSrange
使用,所以我刪除了它,現在的代碼工作,但結果是60%不準確特別是當我的性格位於二線或三線。我在這裏弄翻了翻譯嗎?或者有更好的方法來準確地獲得我的角色座標嗎?
我使用
NSMakeRange(index, 1)
我PARAMS找到一個特定的字符
======= =======修訂
我曾嘗試定製的UITextView到訪問其佈局管理器,但不幸的是,如果有兩行或更多行,該位置仍然不準確。 (只有在我的textView中只有1行時纔是準確的)
class LyricTextView: UITextView {
func boundingRect(forCharacterRange range: NSRange) -> CGRect {
let inset = self.textContainerInset
let rect = self.layoutManager.boundingRect(forGlyphRange: range, in: textContainer).offsetBy(dx: inset.left, dy: inset.top)
return rect
}
}
我在這段代碼中丟失了什麼嗎?這是越來越接近完成
是否有可能讓我們知道您的搜索字符統籌的目的是什麼? –
爲什麼'var glyphRange:NSRange'。在Objective-C中,它使用'&glyphRange',所以方法是'layoutManager.characterRange()'實際上給它一個值。這就是爲什麼。這與'[myUIColor getRed:&red green:&green blue:&blue alpha:&alpha];'是一樣的「邏輯」。 – Larme
@elk_cloner我需要在我的特定角色上方繪製和絃,例如:「我愛上了你的[G]形狀」 我必須在「形狀」字樣的頂部正好畫出「G」 @Larme 是的,我知道該方法是'layoutManager.characterRange()',但我很困惑如何填充actualGlyphRange PARAMS? –