14

絵文字アイコンを独自のカスタムグラフィックで上書きしたい(アプリ内のみ)。

私がこれまで読んだことから、考えられる解決策の1つは、目的の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)が絵文字セクションに値がある文字に出くわすと、デフォルトでAppleColorEmojiフォントを使用して描画することを主張したいと思います。Apple Color Emojiフォントが実際にiOSでどのように描画されるかについてのドキュメントがないため、これを証明するのは実際には困難ですが、これはもっともらしい説明のようです。キャラクターパレットアプリからテキストエディットのファイルに絵文字をドロップし、それを選択してフォントを変更しようとすると、それが行われないことがわかります。同様に、テキストを入力して選択し、フォントをApple Color Emojiに変更しようとすると、テキストが表示されないことがわかります。Apple Color Emojiフォントを逆コンパイルしたとき、テキスト文字の文字マッピングまたはグリフが見つかりませんでした(0〜9を除く)。どういうわけか、ラベルのフォントをApple Color Emojiとして設定しても、ラベルのテキストのテキスト(非絵文字)部分のフォントは別のものに設定されます。

Apple Color Emojiフォント周辺のこの領域はまだ非常に不明確なままなので、コメントして知識を共有してください。

于 2013-06-18T13:37:44.093 に答える
0

1つの解決策は、UITextFieldまたはTextViewデリゲートを使用してユーザーの入力をリッスンすることです。UIImageView絵文字を入力するときは、テキストとインラインでポップし、入力した絵文字アイコンを削除します。

于 2011-11-25T23:59:14.863 に答える
0

この問題については、Appleのプライベート開発フォーラム(iOS開発者プログラムの登録メンバーである場合にアクセスできます)にいくつか言及されています。

考えられる解決策は、表示しようとしているものすべてのフォントを明示的に設定することだと思われます。

于 2011-11-26T06:15:40.760 に答える