2016-04-26 170 views
1

在我的iOS键盘的扩展,我有一个向后移动光标如下功能:如何解决表情符号被分解为字符?

(textDocumentProxy).adjustTextPositionByCharacterOffset(-1) 

,并使用由苹果公司提供的textDocumentProxy.documentContextBeforeInput功能光标在一个UILabel前右侧显示的话。问题是,只要标签内出现表情符号,它就会像这样分开: enter image description here

有什么办法可以避免这种情况吗?这与我对-1进行硬编码有什么关系?我尝试过使用str.utf16.count,但由于某种原因,它完全不能滚动。任何帮助将不胜感激。

Here's我从几个月前的问题,从来没有得到回答

+1

如果旧问题没有得到解答,那么可能值得开始赏金?此外,我会建议阅读堆栈中有关字符串堆栈上的优秀答案:http://stackoverflow.com/a/23397279/3723434。作者使用西里尔作为多字节字符串的示例,这类似于表情符号它的用途。 – trdavidson

回答

1

看来,每个偏移将16位和32位元的任何字符移动光标将减半。因此,解决方案是我们将光标移动2位而不是1的每32位字符。

func moveCursorBy(offset: Int, onProxy proxy: UITextDocumentProxy){ 
    var realOffset = 0 
    if offset < 0, let text = proxy.documentContextBeforeInput { 
     for uni in text.unicodeScalars.reverse().prefix(abs(offset)){ 
      realOffset -= uni.value > 0xFFFF ? 2 : 1 
     } 
    } 
    else if offset > 0, let text = proxy.documentContextAfterInput{ 
     for uni in text.unicodeScalars.prefix(abs(offset)) { 
      realOffset += uni.value > 0xFFFF ? 2 : 1 
     } 
    } 
    else{ 
     realOffset = offset 
    } 
    proxy.adjustTextPositionByCharacterOffset(realOffset) 
} 
+0

嘿,这似乎适用于一些表情符号,但不是全部!即它的工作原理但未能成功。有没有解决的办法?尽管我已经提出了你的答案! – cyril