2016-04-26 39 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