Переопределение графики эмодзи

Я хочу переопределить значки эмодзи своей собственной графикой (только в моем приложении).

Из того, что я прочитал до сих пор, одним из возможных решений является создание пользовательского расширения шрифта, которое переопределяет нужные символы Unicode. Предпочтительно, я хотел бы поддерживать совместимость с CATextLayer.

Изменить: похоже, что пользовательские шрифты не будут моим решением; шрифты должны быть определены в оттенках серого. Следующая возможность: создание пользовательского CALayer, разбивка строки на сегменты на основе кода смайликов и выполнение настройки типа + рендеринга графики вручную (т.е. с основной графикой и основным текстом)

Изменить: также необходимо поддерживать плавную прокрутку в табличных представлениях.


person lorean    schedule 25.11.2011    source источник
comment
Может быть, это поможет вам - stackoverflow.com/questions/ 1225514/   -  person Sagar    schedule 06.12.2011


Ответы (3)


Я посвятил много времени попыткам сделать то же самое. Лучше всего заменить значения Unicode для смайликов в вашем NSString, например.  и т. д. со строкой-заполнителем. Вы можете заменить кодировку эмодзи тегом 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 для отображения temp.

 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. Отсутствие документации о том, как шрифт Apple Color Emoji на самом деле рисуется на iOS, на самом деле мешает мне доказать это, но это кажется правдоподобным объяснением. Если вы перетащите эмодзи из приложения палитры символов в файл в textEdit, затем выберете его и попытаетесь изменить шрифт, вы увидите, что этого не происходит. Точно так же, если вы наберете текст, затем выберете его и попытаетесь изменить его шрифт на Apple Color Emoji, вы увидите, что этого не происходит. Когда я декомпилировал шрифт Apple Color Emoji, я не нашел сопоставления символов или глифов для текстовых символов (кроме 0-9). Каким-то образом, даже если вы установите шрифт метки как Apple Color Emoji, шрифт для текстовой (не смайликов) части текста вашей метки будет установлен на что-то другое.

Пожалуйста, не стесняйтесь комментировать и делиться своими знаниями, поскольку эта область вокруг шрифта Apple Color Emoji все еще остается очень неясной.

person JohnVanDijk    schedule 18.06.2013
comment
Потрясающий. Давно не касался этой проблемы и месяцами не работал над iOS. Но вы получили мой голос! - person lorean; 20.06.2013

Одним из решений может быть использование делегата UITextField или TextView и прослушивание ввода пользователя. Когда они набирают символ смайлика, вставьте встроенный UIImageView с текстом и удалите значок смайлика при вводе.

person Peter Kazazes    schedule 25.11.2011
comment
Спасибо за предложения. К сожалению, в моем случае мне нужно избегать использования объектов UIKit, поскольку они страдают от прерывистой производительности прокрутки. - person lorean; 29.11.2011
comment
@lorean Если у вас возникают проблемы с производительностью прокрутки только из-за включения нескольких UIView, то вы, вероятно, делаете что-то опрометчивое, например, настраиваете вспомогательный CALayer. Можете ли вы уточнить? - person Conrad Shultz; 11.04.2012
comment
Привет Конрад. Я провел обширное тестирование с использованием UIViews в tableCells. Я никогда не мог заставить ячейку таблицы прокручиваться идеально плавно. Всегда будет пропуск кадров, а иногда и низкая общая частота кадров. Что я делаю, так это сворачиваю иерархию представлений в один drawRect: или, совсем недавно, создаю композицию CALayers. Если у вас есть пример кода сложного tableViewCell, полностью построенного из UIViews с отличной производительностью прокрутки, я бы очень хотел его увидеть! - person lorean; 12.04.2012
comment
Вернусь к тому, что я сказал здесь. Определенно можно получить хорошую производительность на UIViews. Но есть куча хитростей и настроек по умолчанию, о которых вам нужно знать. - person lorean; 31.08.2012

Есть несколько упоминаний об этой проблеме на частных форумах разработчиков Apple (к которым у вас есть доступ, если вы являетесь зарегистрированным участником программы разработчиков iOS).

Похоже, потенциальным решением было бы явно установить шрифт для всего, что вы пытаетесь отобразить.

person Michael Dautermann    schedule 26.11.2011
comment
У меня есть доступ к форумам, но я ничего не могу найти. Даже поиск смайликов не дает результатов поиска. - person lorean; 29.11.2011
comment
Некоторые ссылки могут быть полезны, @Michael? - person Emil; 03.12.2011
comment
Привет @Emil... вот один (первая пара ответов в этой теме говорит о настройке шрифт); Интересно, будет ли флаг plist KeyboardEmojiEverywhere работать в plist одного приложения? Если это не так, я бы порекомендовал подать запрос на добавление функции на bugreporter.apple.com. - person Michael Dautermann; 03.12.2011