gpt4 book ai didi

ios - NSLayoutManager、boundingRectForGlyphRange 和表情符号

转载 作者:搜寻专家 更新时间:2023-10-31 19:37:47 27 4
gpt4 key购买 nike

我正在使用 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)

这意味着这两种方法给出了两种完全不同的尺寸!这不是问题,但“偏移量”会堆叠更多行。

Example of the stacked offset

我为 characterIndexForPoint 给我的字符设置了紫色背景,为 boundingRectForGlyphRange 的矩形设置了绿色轮廓,黄点是实际的点击位置。请注意,绿色矩形与不同的字符很好地对齐,但是,这没有任何意义,因为它恰好在这种特定情况下很好地对齐。

我是不是忽略了一些明显的东西,或者这是 iOS 中的一个问题?

最佳答案

我已经解决了这个问题。看来 NSAttributedString.drawInRectCoreText 的绘制方式不同。我现在使用以下代码在 drawRect 中绘制文本:

let totalRange = layoutManager.glyphRangeForTextContainer(textContainer)

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

关于ios - NSLayoutManager、boundingRectForGlyphRange 和表情符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38619395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com