2016-07-27 215 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) 

这让我可以用,直到我开始添加表情符号文字工作的正确指标。一旦添加了表情符号,就开始为检测提供一个偏移量。这让我看到了我正在寻找的字形的边界矩形。我注意到表情符号的边界矩形太大了。我设置了以下的测试案例来检查的区别:

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 S:

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的矩形绿色的轮廓和黄点是实际taplocation。请注意,绿色矩形很好地排列了不同的字符,然而,这并不表示任何迹象,因为它恰好在这个特定情况下排队很好。

我可以忽略一些明显的东西,或者这是iOS的问题吗?

回答

1

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

let totalRange = layoutManager.glyphRangeForTextContainer(textContainer) 

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