Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我如何处理表情符号被分解成的角色?_Ios_Swift_Unicode_Ios Keyboard Extension - Fatal编程技术网

Ios 我如何处理表情符号被分解成的角色?

Ios 我如何处理表情符号被分解成的角色?,ios,swift,unicode,ios-keyboard-extension,Ios,Swift,Unicode,Ios Keyboard Extension,在iOS键盘扩展中,我有一个向后移动光标的功能,如下所示: (textDocumentProxy).adjustTextPositionByCharacterOffset(-1) 并使用Apple提供的textDocumentProxy.documentContextBeforeInput功能在UILabel中显示光标前的单词。问题是,每当表情符号出现在标签内时,它就开始被分开: 有没有办法避免这种情况?这和我硬编码-1有关吗?我尝试过使用str.utf16.count,但由于某些原因,它根

在iOS键盘扩展中,我有一个向后移动光标的功能,如下所示:

(textDocumentProxy).adjustTextPositionByCharacterOffset(-1)
并使用Apple提供的
textDocumentProxy.documentContextBeforeInput
功能在UILabel中显示光标前的单词。问题是,每当表情符号出现在标签内时,它就开始被分开:

有没有办法避免这种情况?这和我硬编码-1有关吗?我尝试过使用
str.utf16.count
,但由于某些原因,它根本无法滚动。任何帮助都将不胜感激


几个月前我的问题一直没有得到回答,似乎每个偏移量都会将光标移动16位,任何32位的字符都会被减半。因此,解决方案是,对于每32位字符,我们将光标移动2,而不是1

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)
}
func moveCursorBy(偏移量:Int,onProxy代理:UITextDocumentProxy){
var realpoffset=0
如果偏移量<0,则让text=proxy.documentContextBeforeInput{
对于文本中的uni.unicodeScalars.reverse().前缀(abs(偏移量)){
realpoffset-=uni.value>0xFFFF?2:1
}
}
否则,如果偏移量>0,则让text=proxy.documentContextAfterInput{
用于文本中的uni。unicodeScalars。前缀(abs(偏移量)){
realpoffset+=uni.value>0xFFFF?2:1
}
}
否则{
realpoffset=偏移量
}
proxy.adjustTextPositionByCharacterOffset(realOffset)
}

如果老问题一直没有得到回答,那么开始悬赏是否值得?此外,我还建议您在堆栈上阅读关于字符串中的字符的这一优秀答案:。作者使用西里尔字母作为多字节字符串的示例,这与表情符号的使用类似。嘿,这似乎对某些表情符号很好,但并非所有表情符号都有效!i、 e.它对你有用