とカスタムUILabelの座標の文字を探します私のインデックスからのY座標。は私が私の文字のインデックスを持っている</p> <p>、(それが複数行でParagraphLineSpacingとAttributedTextを持っている)私のUILabelに私の文字の位置を特定する必要があるが、今私はXを得ることができないattributedText
見つけていると私は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を試してみました======= ======= UPDATED1つの特定の文字に
を見つけるために私の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)
:それはほとんどあなたのコンパイルエラーのために簡単に修正がこれを使用することです
文字コーディネーションの検索の目的を教えてもらえますか? –
なぜ '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()'メソッドを知っていますが、私は実際のGlyphRangeパラメータを埋める方法が混乱していますか? –