2011-11-25 21 views
14

Quiero anular los iconos emoji con mis propios gráficos personalizados (solo dentro de mi aplicación).Anulación de los gráficos Emoji

Según lo que he leído hasta ahora, una solución posible es crear una extensión de fuente personalizada que anule los caracteres Unicode deseados. Preferible, me gustaría mantener la interoperabilidad con CATextLayer.

Editar: Parece que las fuentes personalizadas no serán mi solución; las fuentes deben definirse en escala de grises. Posibilidad siguiente: crear un CALayer personalizado, dividir la cadena en segmentos basados ​​en el código emoji y realizar el ajuste de tipo + representación gráfica manualmente (es decir, con gráficos centrales y texto central)

Editar: También busca mantener el rendimiento de desplazamiento suave en una vista de tabla

+0

Puede ser que esto ayudaría a que - http://stackoverflow.com/questions/1225514/making-an-emoji-enabeling-app – Sagar

Respuesta

2

He dedicado mucho tiempo tratando de hacer lo mismo. Su mejor opción es reemplazar los valores Unicode para los emoji en su NSString, por ejemplo. \ uE100 etc. con una cadena de marcador de posición. Puede reemplazar las codificaciones de emoji con una etiqueta HTML y usar UIWenViews o DTCoreText para dibujar la imagen en línea. yo he hecho esto, funciona también, pero será un poco lento

Aquí es un poco de arranque (especialmente si desea mostrar esta etiqueta en vistas de tabla.):

Hacer un diccionario con UIImages como objetos de marcador de posición y cadenas como claves:

 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]]; 
    }]; 

usted puede en este punto de carga este código HTML en un UIWebView y usted tendrá lo que quiere.

[myWebView loadData:_htmlData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];//do create the webview first 

Si la velocidad lenta de un UIWebView es una preocupación, puede leer más adelante. En cualquier caso, mira la nota hacia el final de esta respuesta.

Para crear un DTAttributedLabel, hacemos lo siguiente: En primer lugar se construye un NSattributedString utilizando el DTHTMLAttributedStringBuilder:

NSAttributedString *temp = [[[DTHTMLAttributedStringBuilder alloc] initWithHTML:text1 
                options:@{ 
            DTDefaultFontFamily: @"Helvetica", 
            DTDefaultFontSize:@15,}; 
            documentAttributes:nil] 
            generatedAttributedString]; 

continuación, puede utilizar una instancia DTAttributedLabel para mostrar temp.

self.tempLabel.attributedString = temp;//create a DTAttributedLabel Instance called tempLabel before this, I had it as a property 

Mi objetivo era generar etiquetas de texto muy rápido (Vistas de tabla) al mismo tiempo que admitía emoticones personalizados. DTAttributedLabels es rápido (mucho más rápido que un UIWebView) NOTA: También hice una fuente personalizada donde había asignado los valores Unicode para los emojis a un glifo personalizado. Para mi sorpresa, aún se muestran los emojis predeterminados. Me gustaría afirmar aquí que cada vez que iOS (CoreText) se encuentra con un personaje cuyo valor se encuentra en la sección Emoji, lo dibuja usando la fuente AppleColorEmoji de forma predeterminada.La falta de documentación sobre cómo la fuente Apple Color Emoji se dibuja realmente en iOS realmente me dificulta probar esto, pero esta parece ser una explicación plausible. Si coloca un emoji de la aplicación de la paleta de caracteres en un archivo en textEdit, selecciónelo e intente cambiar la fuente; verá que no sucede. Del mismo modo, si escribe texto, selecciónelo e intente cambiar su fuente a Apple Color Emoji, verá que no sucede. Cuando descompuse la fuente Apple Color Emoji, no encontré mapeos de caracteres ni glifos para caracteres textuales (excepto 0-9). De alguna manera, incluso si configura la fuente de una etiqueta como Apple Color Emoji, la fuente para la parte textual (no emoji) del texto de su etiqueta se establece en otra cosa.

Siéntase libre de comentar y compartir sus conocimientos, ya que esta región en torno a la fuente Apple Color Emoji aún no está muy clara.

+0

Impresionante. Ha pasado mucho tiempo desde que toqué este problema y no he estado trabajando en iOS durante meses. ¡Pero tienes mi voto popular! – lorean

0

Una solución sería utilizar el delegado UITextField o TextView y escuchar la entrada del usuario. Cuando escriben un carácter emoji, abren un UIImageView en línea con el texto y eliminan el icono de emoji con la entrada.

+0

Gracias por las sugerencias. Desafortunadamente, en mi caso necesito evitar el uso de objetos UIKit, ya que sufren un rendimiento de desplazamiento entrecortado. – lorean

+0

@lorean Si obtiene problemas de rendimiento de desplazamiento solo por incluir algunas UIViews, probablemente esté haciendo algo mal aconsejado, como ajustar el respaldo de CALayer. ¿Puedes elaborar? –

+0

Hola Conrad. He realizado pruebas exhaustivas usando UIViews en tableCells. Nunca podría hacer que la celda de la tabla se desplazara perfectamente sin problemas. Siempre habrá saltos de cuadros y ocasionalmente baja velocidad de cuadros general. Lo que hago es colapsar la jerarquía de vistas en un drawRect: o, más recientemente, crear una composición de CALayers. Si tienes algún código de muestra de un tableViewCell complicado construido completamente con UIViews con un excelente rendimiento de desplazamiento, ¡me gustaría verlo! – lorean

0

Hay algunas menciones de este problema en los devforums privados de Apple (a los que tiene acceso si es un miembro registrado del programa para desarrolladores de iOS).

Parece que la posible solución sería establecer explícitamente la fuente para lo que sea que intente mostrar.

+0

Tengo acceso a los foros, pero no puedo encontrar nada. Incluso la búsqueda de emoji arroja cero resultados de búsqueda. – lorean

+0

Algunos enlaces pueden ser útiles, @Michael? – Emil

+0

Hola @Emil ... [aquí está uno] (https://devforums.apple.com/message/531811#531811) (primer par de respuestas en esa charla hilo sobre la configuración de un tipo de letra); Me pregunto si el indicador 'KeyboardEmojiEverywhere' funcionaría dentro del plist de una sola aplicación. Si no es así, recomendaría presentar una solicitud de función en bugreporter.apple.com. –