Переопределение графики Эможи

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

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

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

Редактировать: также нужно поддерживать плавную прокрутку в представлениях таблицы.

Ответы

Ответ 1

Я посвятил много времени, пытаясь сделать то же самое. Лучше всего заменить значения unicode для emoji в вашем NSString, например. \uE100 и т.д. с помощью строки-заполнителя. Вы можете заменить кодировки emoji тегом 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

Моя цель состояла в том, чтобы сгенерировать текстовую метку очень быстро (Table Views), поддерживая пользовательские смайлики. DTAttributedLabels быстрые (намного быстрее, чем UIWebView) ЗАМЕТКА: Я также создал собственный шрифт, где я сопоставил значения unicode для emojis с пользовательским глифом. К моему удивлению, все же были отображены стандартные эмоции. Я хотел бы здесь заявить, что всякий раз, когда iOS (CoreText) встречается с символом, значение которого находится в разделе Emoji, оно рисует его с использованием шрифта AppleColorEmoji по умолчанию. Отсутствие документации о том, как шрифт Apple Color Emoji на самом деле рисуется на iOS, на самом деле затрудняет мне это доказать, но это кажется правдоподобным объяснением. Если вы выбросите emoji из приложения палитры символов в файл в textEdit, затем выберите его и попробуйте изменить шрифт, вы увидите, что этого не происходит. Аналогично, если вы наберете текст, затем выберите его и попробуйте изменить его шрифт на Apple Color Emoji, вы увидите, что этого не произойдет. Когда я декомпилировал шрифт Apple Color Emoji, я не нашел символьные сопоставления или глифы для текстовых символов (кроме 0-9). Так или иначе, даже если вы установили шрифт ярлыка как Apple Color Emoji, шрифт текстовой (неэможи) части вашего текста ярлыка будет установлен на что-то еще.

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

Ответ 2

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

Ответ 3

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

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