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