Перекрывающая Графика Emoji - PullRequest
14 голосов
/ 26 ноября 2011

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 18 июня 2013

Я посвятил много времени попыткам сделать то же самое.Лучше всего заменить значения Unicode для смайликов в строке NSString, например.\ 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). ПРИМЕЧАНИЕ. Я также создал собственный шрифт, в котором я сопоставил значения юникода для смайликов с пользовательским глифом.К моему удивлению, все еще отображались смайлики по умолчанию.Здесь я хотел бы заявить, что всякий раз, когда iOS (CoreText) встречает персонажа, значение которого находится в разделе Emoji, он рисует его с помощью шрифта AppleColorEmoji по умолчанию.Отсутствие документации о том, как на самом деле нарисован шрифт Apple Color Emoji на iOS, затрудняет мне это доказать, но это, кажется, правдоподобное объяснение.Если вы поместите эмодзи из приложения палитры символов в файл в textEdit, затем выберите его и попытаетесь изменить шрифт, вы увидите, что этого не происходит.Точно так же, если вы наберете какой-то текст, затем выделите его и попытаетесь изменить его шрифт на Apple Color Emoji, вы увидите, что этого не происходит.Когда я декомпилировал шрифт Apple Color Emoji, я не нашел сопоставления символов или глифов для текстовых символов (кроме 0-9).Так или иначе, даже если вы установите шрифт ярлыка Apple Color Emoji, шрифт для текстовой (не эмодзи) части текста вашего ярлыка будет установлен на что-то другое.

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

0 голосов
/ 26 ноября 2011

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

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

0 голосов
/ 26 ноября 2011

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

...