4

NSAttributedStringdrawInRect(rect: CGRect)メソッドを使用して、絵文字を含む可能性のあるテキストを表示しています。テキストのタップを検出したいので、次の方法を使用して、タップされた文字を確認します。

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)

これにより、絵文字をテキストに追加し始めるまで作業できる正しいインデックスが得られます。絵文字が追加されるとすぐに、検出のオフセットが始まります。これにより、私が探していたグリフの境界四角形を見るようになりました。絵文字の外接する長方形が大きすぎることに気付きました。違いを確認するために、次のテストケースを設定しました。

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の結果が得られました。

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

これが意味することは、これら 2 つの方法で 2 つのまったく異なるサイズが得られるということです! これは問題にはなりませんが、「オフセット」はより多くの行でスタックします。

積み上げオフセットの例

提供されたキャラクターに紫色の背景を設定し、緑色の輪郭の四角形characterIndexForPointを与えboundingRectForGlyphRange、黄色の点が実際のタップ位置です。緑色の四角形は別の文字ときれいに並んでいることに注意してください。ただし、この特定のケースではたまたまきれいに並んでいるため、これは何の指標にもなりません。

明らかなことを見落としていますか、それとも iOS の問題ですか?

4

1 に答える 1

1

問題を解決しました。とはNSAttributedString.drawInRect描き方が違うようCoreTextです。次のコードを使用して、テキストを描画しますdrawRect

let totalRange = layoutManager.glyphRangeForTextContainer(textContainer)

layoutManager.drawBackgroundForGlyphRange(range, atPoint: CGPointZero)
layoutManager.drawGlyphsForGlyphRange(range, atPoint: CGPointZero)
于 2016-07-28T14:45:06.843 に答える