2011-11-25 22 views
14

我想用自己的自定義圖形覆蓋表情符號圖標(僅在我的應用程序中)。覆寫表情符號圖形

從我迄今爲止閱讀的內容來看,一種可能的解決方案是創建一個覆蓋所需的Unicode字符的自定義字體擴展。我希望保持與CATextLayer的互操作性。

編輯:看起來像自定義字體不會是我的解決方案;字體必須以灰度定義。下一種可能性:創建一個自定義的CALayer,根據表情符號將字符串分成段,然後手動進行類型設置+圖形渲染(即核心圖形和核心文本)

編輯:同時希望保持平滑的滾動性能一張桌子的意見。

+0

可能這會幫助你 - http://stackoverflow.com/questions/1225514/making-an-emoji-enabeling-app – Sagar

回答

2

我已經投入了很多時間去做同樣的事情。你最好的選擇是替換NSString中的表情符號的Unicode值。 \ uE100等佔位符字符串。您可以用HTML標記替換表情符號編碼,並使用UIWenViews或DTCoreText以內嵌方式繪製圖像。 我已經做到了這一點,它也能工作,但它會有點慢

這裏是一個小起動器(特別是如果你想顯示這個標籤在表格視圖):

請與UIImages字典作爲對象和佔位符字符串作爲鍵:

 self.emoticonDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"happyEmoticon.png", @":)", 
         @"sadEmoticon.png",  @":(", 
         @"testImg.png",   @"\uE100", 
         nil]; 


__block NSString *text1 = [NSString stringWithFormat:@"<html><p>%@</p></html>",text]; 
    [self.emoticonDict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) { 
     text1 = [text1 stringByReplacingOccurrencesOfString:key withString:[NSString stringWithFormat:@"<img height= 15 width= 15 src=\"%@\">",obj]]; 
    }]; 

您可以在這點荷載這個HTML到一個UIWebView,你將有你想要的東西。

[myWebView loadData:_htmlData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];//do create the webview first 

如果關注UIWebView的慢速問題,可以提前閱讀。在這兩種情況下,都要看看這個答案結尾處的註釋。

要創建一個DTAttributedLabel,我們做以下幾點:首先 我們建立了一個NSattributedString使用DTHTMLAttributedStringBuilder:

NSAttributedString *temp = [[[DTHTMLAttributedStringBuilder alloc] initWithHTML:text1 
                options:@{ 
            DTDefaultFontFamily: @"Helvetica", 
            DTDefaultFontSize:@15,}; 
            documentAttributes:nil] 
            generatedAttributedString]; 

然後你可以使用一個DTAttributedLabel實例,以顯示溫度。

self.tempLabel.attributedString = temp;//create a DTAttributedLabel Instance called tempLabel before this, I had it as a property 

我的目標是在支持自定義圖釋的同時生成文本標籤的速度非常快(表視圖)。 DTAttributedLabels速度快(比UIWebView快得多) 注意: 我還製作了一個自定義字體,我已將emojis的unicode值映射到自定義字形。令我驚訝的是,仍然顯示了默認的emojis。我想在這裏聲明,無論何時iOS(CoreText)遇到一個字符,其值在Emoji部分,它默認使用AppleColorEmoji字體繪製它。缺少有關Apple Color Emoji字體在iOS上如何繪製的文檔實際上使我很難證明這一點,但這似乎是合理的解釋。 如果您從文字編輯器中將角色調色板應用程序中的表情符號拖放到文件中,然後選擇它並嘗試更改字體,您會發現它不會發生。 同樣,如果您鍵入一些文字,然後選擇它並嘗試將其改爲Apple Color Emoji的字體,您將看到它不會發生。當我反編譯Apple Color Emoji字體時,我沒有找到文字字符的字符映射或字形(0-9除外)。不管怎樣,即使您將標籤的字體設置爲Apple Color Emoji,標籤文本的文字(非表情符號)部分的字體也會設置爲其他字體。

請隨時評論和分享您的知識,因爲圍繞Apple Color Emoji字體的這個區域仍然很不清楚。

+0

太棒了。我碰到這個問題已經很長時間了,並且還沒有在iOS上工作好幾個月。但是你已經得到了我的讚賞! – lorean

0

一種解決方案是使用UITextFieldTextView委託並監聽用戶的輸入。當他們鍵入一個表情符號時,彈出與文本內嵌的UIImageView,並用輸入刪除表情符號圖標。

+0

感謝您的建議。不幸的是,在我的情況下,我需要避免使用UIKit對象,因爲他們遭受波濤洶涌的滾動性能。 – lorean

+0

@lorean如果您僅僅通過包含幾個UIViews就會遇到滾動性能問題,那麼您可能會做一些不明智的事情,比如調整後備CALayer。你能詳細說明嗎? –

+0

你好康拉德。我已經使用tableCells中的UIViews進行了廣泛的測試。我永遠無法讓表格單元順利滾動。總會有幀跳過,偶爾整體幀率很低。我所做的是將視圖層次結構合併爲一個drawRect:或最近創建一個CALayers組合。如果你有一些複雜的tableViewCell的示例代碼,完全由具有出色滾動性能的UIView構造,我真的很想看到它! – lorean

0

在Apple的私人開發者論壇(如果您是iOS開發人員計劃的註冊會員,您可以訪問)中有幾處提及此問題。

這聽起來像是潛在的解決方案是明確設置字體爲任何你試圖顯示。

+0

我有權訪問論壇,但無法找到任何內容。即使搜索表情符號也會返回零搜索結果。 – lorean

+0

有些鏈接可能有用,@Michael? – Emil

+0

嗨@Emil ... [這裏是一個](https://devforums.apple.com/message/531811#531811)(該主題中的第一對夫婦反應談論設置字體);我想知道'KeyboardEmojiEverywhere' plist標誌可以在單個應用程序的plist中工作嗎?如果沒有,我建議在bugreporter.apple.com上提交一個功能請求。 –