2016-07-27 12 views
3

NSAttributedStringdrawInRect(rect: CGRect)メソッドを使用して絵文字を含む可能性のあるテキストを表示しています。私は文字がタップされたかを確認するために、以下の方法を使用したテキスト上のタップを検出したいので:NSLayoutManager、boundingRectForGlyphRangeと絵文字

let textStorage = NSTextStorage(attributedString: attributedString) 
let layoutManager = NSLayoutManager() 
layoutManager.usesFontLeading = true 
textStorage.addLayoutManager(layoutManager) 

let textContainer = NSTextContainer(size: containerSize) 
layoutManager.addTextContainer(textContainer) 

textContainer.lineFragmentPadding = 0.0 

layoutManager.ensureLayoutForTextContainer(textContainer) 

let tappedIndex = layoutManager.characterIndexForPoint(point, 
     inTextContainer: textContainer, 
     fractionOfDistanceBetweenInsertionPoints: nil) 

これは、私がテキストに絵文字を追加し始めるまで、私が一緒に作業することができ、正しいインデックスを提供します。絵文字が追加されるとすぐに、検出のためのオフセットが始まります。これは、私が探していたグリフの境界矩形を見てくれました。私は絵文字の境界の長方形が大きすぎることに気づいた。私は違いを確認するには、次のテストケースを設定します。これは、これらの2つの方法が2つの全く異なるサイズを与えるということである意味は何

glyphRect = (0.0, 0.0, 23.0, 28.875) 
boundingRect = (0.0, 0.0, 23.0, 23.8671875) 

:このコードを実行する

let emojiText = "" 
let font = UIFont.systemFontOfSize(20.0) 
let containerSize = CGSize(width: 300.0, height: 20000.0) 

let attributedString = NSAttributedString(string: emojiText, attributes: [NSFontAttributeName: font]) 

let textStorage = NSTextStorage(attributedString: attributedString) 
let layoutManager = NSLayoutManager() 
layoutManager.usesFontLeading = true 
textStorage.addLayoutManager(layoutManager) 

let textContainer = NSTextContainer(size: containerSize) 
layoutManager.addTextContainer(textContainer) 
textContainer.lineFragmentPadding = 0.0 

layoutManager.ensureLayoutForTextContainer(textContainer) 

let glyphRect = layoutManager.boundingRectForGlyphRange(NSRange(location: 0, length: attributedString.length), inTextContainer: textContainer) 
let boundingRect = attributedString.boundingRectWithSize(containerSize, options:[.UsesLineFragmentOrigin, .UsesFontLeading], context: nil) 

は、次のCGRect秒ました!これは問題ではありませんが、「オフセット」はより多くの行でスタックします。

Example of the stacked offset

私は、 characterIndexForPointがくれたキャラクターのための紫色の背景を設定 boundingRectForGlyphRangeの緑のアウトラインをRECTを与え、黄色の点は、実際のtaplocationです。緑色の矩形は異なる文字とうまく並んでいることに注意してください。しかし、この特定のケースではうまく整列しているので、これはまったく表示されません。

明らかに何かが見落とされているのですか、これはiOSの問題ですか?

答えて

1

私はこの問題を解決しました。 は、CoreTextとは異なるように見えます。今度は、次のコードを使用してdrawRectにテキストを描画します。

let totalRange = layoutManager.glyphRangeForTextContainer(textContainer) 

layoutManager.drawBackgroundForGlyphRange(range, atPoint: CGPointZero) 
layoutManager.drawGlyphsForGlyphRange(range, atPoint: CGPointZero)