2017-05-26 10 views
1

とカスタムUILabelの座標の文字を探します私のインデックスからのY座標。は私が私の文字のインデックスを持っている</p> <p>、(それが複数行でParagraphLineSpacingとAttributedTextを持っている)私のUILabelに私の文字の位置を特定する必要があるが、今私はXを得ることができないattributedText

私はこのhttp://techqa.info/programming/question/19417776/how-do-i-locate-the-cgrect-for-a-substring-of-text-in-a-uilabel

見つけていると私はactualGlyphRangeがNSRangePointer、ないNSRangeを尋ねるので、残念ながら、私は本当にこのコードを使用することはできません、私のスウィフト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) 

} 

に翻訳されますが、私

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%で、特に2行目または3行目にある文字は正確ではありません。私はここで翻訳を台無しにしましたか?または、私のキャラクターが正確に座標を取得する良い方法はありますか?

私はにカスタムUITextViewを試してみました======= ======= UPDATED

1つの特定の文字に

を見つけるために私のparamsのため

NSMakeRange(index, 1) 

を使用

そのレイアウトマネージャにアクセスしますが、残念ながら、2行以上の場合は位置が不正確です。 (私の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() 
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: &glyphRange) 

:それはほとんどあなたのコンパイルエラーのために簡単に修正がこれを使用することです

+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()'メソッドを知っていますが、私は実際のGlyphRangeパラメータを埋める方法が混乱していますか? –

答えて

0

を行ってきています。

@IBOutlet var textView: UITextView! 
... 

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

あなたがまた次加工したように、考慮にテキストビューのテキストコンテナのインセットを取る必要があると思われる:UITextViewを使用すると、あなたのためにOKの場合

、あなたはそのレイアウトマネージャやテキストコンテナへのアクセス権を持っています私は2行目のテキストのバウンディング矩形を取得するために:

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 –

関連する問題