14

我想用我自己的自定义图形(仅在我的应用程序中)覆盖表情符号图标。

从我到目前为止所读到的,一种可能的解决方案是创建一个自定义字体扩展名,它会覆盖所需的 unicode 字符。最好我想保持与 CATextLayer 的互操作性。

编辑:看起来自定义字体不是我的解决方案;字体必须以灰度定义。下一个可能性:创建自定义CALayer,根据表情符号代码将字符串分块,并手动进行类型设置+图形渲染(即使用核心图形和核心文本)

编辑:还希望在表格视图中保持平滑的滚动性能。

4

3 回答 3

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,我们执行以下操作:首先,我们使用 DTHTMLAttributedStringBuilder 构建一个 NSattributedString:

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 快得多) 注意:我还制作了一个自定义字体,其中我已将表情符号的 unicode 值映射到自定义字形。令我惊讶的是,仍然显示默认表情符号。我想在这里声明,每当 iOS (CoreText) 遇到一个其值位于 Emoji 部分的字符时,它默认使用 AppleColorEmoji 字体绘制它。缺乏关于如何在 iOS 上实际绘制 Apple Color Emoji 字体的文档实际上让我很难证明这一点,但这似乎是一个合理的解释。如果您将表情符号从字符调色板应用程序拖放到 textEdit 中的文件上,然后选择它并尝试更改字体,您会发现它没有发生。相似地,如果您键入一些文本,然后选择它并尝试将其字体更改为 Apple Color Emoji,您会发现它不会发生。当我反编译 Apple Color Emoji 字体时,我没有找到文本字符的字符映射或字形(0-9 除外)。不知何故,即使您将标签的字体设置为 Apple Color Emoji,标签文本的文本(非表情符号)部分的字体也会设置为其他字体。

请随时评论和分享您的知识,因为 Apple Color Emoji 字体周围的这个区域仍然非常不清楚。

于 2013-06-18T13:37:44.093 回答
0

一种解决方案是使用UITextFieldTextView委托并听取用户的输入。当他们输入一个表情符号字符时,弹出一个UIImageView内联文本,然后删除输入的表情符号图标。

于 2011-11-25T23:59:14.863 回答
0

在 Apple 的私人开发论坛(如果您是 iOS 开发者计划的注册会员,您可以访问该论坛)上提到了这个问题。

听起来潜在的解决方案是为您要显示的任何内容显式设置字体。

于 2011-11-26T06:15:40.760 回答