2017-05-26 73 views
1

我需要找到我的UILabel我的性格位置(它有ParagraphLineSpacing和AttributedText具有多),定位在自定義的UILabel字符協調與attributedText

我有我的性格的指數,但現在我不能讓X和我的索引中的Y座標。

我發現這個http://techqa.info/programming/question/19417776/how-do-i-locate-the-cgrect-for-a-substring-of-text-in-a-uilabel

,我翻譯成我的雨燕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 
    } 
} 

我在這段代碼中丟失了什麼嗎?這是越來越接近完成

+0

是否有可能讓我們知道您的搜索字符統籌的目的是什麼? –

+0

爲什麼'var glyphRange:NSRange'。在Objective-C中,它使用'&glyphRange',所以方法是'layoutManager.characterRange()'實際上給它一個值。這就是爲什麼。這與'[myUIColor getRed:&red green:&green blue:&blue alpha:&alpha];'是一樣的「邏輯」。 – Larme

+0

@elk_cloner我需要在我的特定角色上方繪製和絃,例如:「我愛上了你的[G]形狀」 我必須在「形狀」字樣的頂部正好畫出「G」 @Larme 是的,我知道該方法是'layoutManager.characterRange()',但我很困惑如何填充actualGlyphRange PARAMS? –

回答

0

一種更容易修復你的編譯錯誤是使用這樣的:

var glyphRange = NSRange() 
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: &glyphRange) 

然而,當我嘗試了,我也只能得到正確的矩形的第一行文字。

如果使用UITextView是確定適合你,你可以訪問它的佈局管理器和文本容器:

@IBOutlet var textView: UITextView! 
... 

let rect = textView!.layoutManager.boundingRect(
    forGlyphRange: glyphRange, in: textView!.textContainer) 

看來你還需要考慮到文本視圖的文本容器邊界所以下面的工作對我來說,得到的文本的邊界矩形第二行:

let inset = textView!.textContainerInset 
let rect = textView!.layoutManager.boundingRect(
    forGlyphRange: glyphRange, in: textView!.textContainer) 
    .offsetBy(dx: inset.left, dy: inset.top) 

如果有人發現了UILabel有效的解決方案,我會感興趣。

+0

我認爲它會好,只要我得到了預期的結果,明天我會試試這個 –

+0

我已經嘗試過UITextView,如果有2行或更多,它仍然無法獲得準確的位置。我已經更新了我的代碼,所以也許我仍然錯過了一些東西? @thm –