www translator serps retweet para online look google emoticones emojis objective-c uitableview nsstring uilabel emoji

objective-c - translator - retweet emoji



Emojis jugando con el tamaƱo de obj-cWithFont math (3)

Estoy usando UILabel

sizeThatFits (_ size: CGSize) -> CGSize

Funciona para mi

mi código

let tempLabel = UILabel() tempLabel.font = font tempLabel.attributedText = attText tempLabel.numberOfLines = 0 let size = tempLabel.sizeThatFits(CGSize(width: 200, height:CGFloat.greatestFiniteMagnitude))

como el código, debe asignar tres propiedades.

En un UITableView que necesita mostrar una larga lista de conversaciones parecidas a un chat, que a menudo contienen emojis, se produce un error de cálculo de tamaño.

Mi problema es que si una cadena tiene la longitud correcta y uso sizeWithFont , en mi primera medición con sizewithfont obtengo una longitud incorrecta de la cadena, lo que provoca un "salto de línea".

Supongo que es porque la cadena ":-)" es más ancha que el ícono de smiley real.

La evidencia se puede ver aquí:

Ahora, en algunas otras pilas, algunos afirman que sizeWithFont solo dará cuenta de la cadena, no del Emoji, lo que para mí no tiene sentido, ya que lo hace "eventualmente" ...

Pero ellos proponen usar sizeToFit en su lugar, así que decidí darle una oportunidad.

Bam, mismo resultado.

¿Alguien sabe cómo contrarrestar esto? ¿Hay un valor boolean para verificar si "La etiqueta se procesó con emoji" para que pueda omitir esa llamada?

Ejecutar la misma línea dos veces no hace nada, parece que se debe dibujar la vista, antes de que sizeWithFont dé cuenta de su error.

La columna mostrada se ejecuta en un - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath , en una celda personalizada. También puedo replicar el error en un UITableViewCell perfectamente regular, por lo que no parece ser eso.


Gracias @SergiSolanellas! Aquí hay una versión que toma un irrumpido, acortando el método porque el texto y la fuente ya están configurados.

// // Given an attributed string that may have emoji characters and the width of // the display area, return the required display height. // - (CGFloat)heightForAttributedStringWithEmojis:(NSAttributedString *)attributedString forWidth:(CGFloat)width { CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedString); CFRange fitRange; CGSize frameSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(width, CGFLOAT_MAX), &fitRange); CFRelease(framesetter); return frameSize.height; }


- (CGFloat)heightStringWithEmojis:(NSString*)str fontType:(UIFont *)uiFont ForWidth:(CGFloat)width { // Get text CFMutableAttributedStringRef attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0); CFAttributedStringReplaceString (attrString, CFRangeMake(0, 0), (CFStringRef) str ); CFIndex stringLength = CFStringGetLength((CFStringRef) attrString); // Change font CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef) uiFont.fontName, uiFont.pointSize, NULL); CFAttributedStringSetAttribute(attrString, CFRangeMake(0, stringLength), kCTFontAttributeName, ctFont); // Calc the size CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString); CFRange fitRange; CGSize frameSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(width, CGFLOAT_MAX), &fitRange); CFRelease(ctFont); CFRelease(framesetter); CFRelease(attrString); return frameSize.height + 10; }