NSString drawInRect: withAttributes: no se centró correctamente al usar NSKernAttributeName

Cuando utilizo drawInRect:withAttributes: y paso en un estilo de párrafo con NSTextAlignmentCenter y un valor distinto de cero para NSKernAttributeName , la cadena no se centra correctamente. ¿Estoy haciendo algo mal o es este comportamiento esperado? ¿Hay alguna solución?

Captura de pantalla:

introduzca la descripción de la imagen aquí

Puede ver claramente que el text superior no está centrado correctamente.

Mi código de demostración:

 - (void)drawRect:(CGRect)rect { // Drawing code UIFont *font = [UIFont systemFontOfSize:15.0]; [self drawString:@"88" inRect:rect font:font textColor:[UIColor blackColor]]; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); CGContextAddRect(context, rect); CGContextStrokePath(context); CGContextRestoreGState(context); } - (void)drawString:(NSString *)text inRect:(CGRect)contextRect font:(UIFont *)font textColor:(UIColor *)textColor { CGFloat fontHeight = font.lineHeight; CGFloat yOffset = floorf((contextRect.size.height - fontHeight) / 2.0) + contextRect.origin.y; CGRect textRect = CGRectMake(contextRect.origin.x, yOffset, contextRect.size.width, fontHeight); NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; paragraphStyle.lineBreakMode = NSLineBreakByClipping; paragraphStyle.alignment = NSTextAlignmentCenter; [text drawInRect:textRect withAttributes:@{NSKernAttributeName: @(self.kerning), NSForegroundColorAttributeName: textColor, NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle}]; } 

¡Gracias!

Actualización , gracias a este comentario , agregué NSBackgroundColorAttributeName: [UIColor greenColor] a los attributes y obtuve el siguiente resultado:

introduzca la descripción de la imagen aquí

El kerning debe aplicarse solo al primer carácter de cada par de kerning. Si desea mostrar una cadena con kerning entre todos los n caracteres, entonces el atributo de kerning debe establecerse para los primeros n-1 caracteres.

En lugar de:

 [text drawInRect:textRect withAttributes:@{NSKernAttributeName: @(self.kerning), NSForegroundColorAttributeName: textColor, NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle}]; 

debe crear una cadena atribuida para que pueda establecer el atributo de kerning para un range específico en lugar de la cadena completa:

 NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:text attributes:@{ NSForegroundColorAttributeName: textColor, NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle}]; [as addAttribute:NSKernAttributeName value:@(self.kerning) range:NSMakeRange(0, [text length] - 1)]; [as drawInRect:textRect]; 

Aquí el resultado para la secuencia "1234" y kerning -4.0:

introduzca la descripción de la imagen aquí

Intereting Posts