tipos tipo teclado tamaño plus para letras letra iconos fuente como celular cambiar aumentar aplicacion agrandar ios4 sizewithfont catextlayer

ios4 - tipo - tamaño letra iphone



Cambia el tamaño de CATextLayer para que se ajuste al texto en iOS (3)

Esta página me dio suficiente para crear un CATextLayer centrado horizontalmente simple: http://lists.apple.com/archives/quartz-dev/2008/Aug/msg00016.html

- (void)drawInContext:(CGContextRef)ctx { CGFloat height, fontSize; height = self.bounds.size.height; fontSize = self.fontSize; CGContextSaveGState(ctx); CGContextTranslateCTM(ctx, 0.0, (fontSize-height)/2.0 * -1.0); [super drawInContext:ctx]; CGContextRestoreGState(ctx); }

Toda mi investigación hasta ahora parece indicar que no es posible hacer esto con precisión. Las únicas dos opciones disponibles para mí al principio fueron:

a) Uso de un administrador de diseño para CATextLayer - no disponible en iOS a partir de 4.0

b) Use sizeWithFont: restrictedToSize: lineBreakMode: y ajuste el marco del CATextLayer de acuerdo con el tamaño devuelto aquí.

La opción (b), al ser el enfoque más simple, debería funcionar. Después de todo, funciona perfectamente con UILabels. Pero cuando apliqué el mismo cálculo de marco a CATextLayer, el marco siempre resultó ser un poco más grande de lo esperado o necesario.

Resulta que el espacio entre líneas en CATextLayers y UILabels (para la misma fuente y tamaño) es diferente. Como resultado, sizeWithFont (cuyos cálculos de espaciado de línea coincidirían con el de UILabels) no devuelve el tamaño esperado para CATextLayers.

Esto se prueba aún más imprimiendo el mismo texto usando un UILabel, en comparación con un CATextLayer y comparando los resultados. El texto en la primera línea se superpone perfectamente (es la misma fuente), pero el espacio entre líneas en CATextLayer es un poco más corto que en UILabel. (Lo siento, no puedo subir una captura de pantalla en este momento porque las que ya tengo contienen datos confidenciales, y actualmente no tengo tiempo para hacer un proyecto de muestra para obtener capturas de pantalla limpias. Las subiré más adelante para la posteridad, cuando Tengo el tiempo

Esta es una diferencia extraña, pero pensé que sería posible ajustar el espaciado en CATextLayer especificando el atributo apropiado para el NSAttributedString que uso allí, pero ese no parece ser el caso. Buscando en CFStringAttributes.h No puedo encontrar un solo atributo que pueda estar relacionado con el interlineado.

Línea de fondo:

Así que parece que no es posible usar CATextLayer en iOS en un escenario en el que se requiere que la capa se ajuste a su texto. ¿Estoy en esto o me estoy perdiendo algo?

PD:

  1. La razón por la que quise usar CATextLayer y NSAttributedString es que la cadena que se va a mostrar debe tener un color diferente en diferentes puntos. Supongo que tendría que volver a dibujar las cuerdas a mano como siempre ... por supuesto, siempre existe la opción de hackear los resultados de sizeWithFont para obtener la altura de línea adecuada.

  2. Abusar un poco de las etiquetas de ''código'' para que la publicación sea más legible.

  3. No puedo etiquetar la publicación con ''CATextLayer'' - sorprendentemente no existen tales etiquetas en este momento. Si alguien con suficiente reputación se topa con esta publicación, etiquétela como corresponda.


Prueba esto:

- (CGFloat)boundingHeightForWidth:(CGFloat)inWidth withAttributedString:(NSAttributedString *)attributedString { CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString( (CFMutableAttributedStringRef) attributedString); CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(inWidth, CGFLOAT_MAX), NULL); CFRelease(framesetter); return suggestedSize.height; }

Tendrás que convertir tu NSString a NSAttributedString. En el caso de CATextLayer , puede usar el siguiente método de subclase CATextLayer :

- (NSAttributedString *)attributedString { // If string is an attributed string if ([self.string isKindOfClass:[NSAttributedString class]]) { return self.string; } // Collect required parameters, and construct an attributed string NSString *string = self.string; CGColorRef color = self.foregroundColor; CTFontRef theFont = self.font; CTTextAlignment alignment; if ([self.alignmentMode isEqualToString:kCAAlignmentLeft]) { alignment = kCTLeftTextAlignment; } else if ([self.alignmentMode isEqualToString:kCAAlignmentRight]) { alignment = kCTRightTextAlignment; } else if ([self.alignmentMode isEqualToString:kCAAlignmentCenter]) { alignment = kCTCenterTextAlignment; } else if ([self.alignmentMode isEqualToString:kCAAlignmentJustified]) { alignment = kCTJustifiedTextAlignment; } else if ([self.alignmentMode isEqualToString:kCAAlignmentNatural]) { alignment = kCTNaturalTextAlignment; } // Process the information to get an attributed string CFMutableAttributedStringRef attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0); if (string != nil) CFAttributedStringReplaceString (attrString, CFRangeMake(0, 0), (CFStringRef)string); CFAttributedStringSetAttribute(attrString, CFRangeMake(0, CFAttributedStringGetLength(attrString)), kCTForegroundColorAttributeName, color); CFAttributedStringSetAttribute(attrString, CFRangeMake(0, CFAttributedStringGetLength(attrString)), kCTFontAttributeName, theFont); CTParagraphStyleSetting settings[] = {kCTParagraphStyleSpecifierAlignment, sizeof(alignment), &alignment}; CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, sizeof(settings) / sizeof(settings[0])); CFAttributedStringSetAttribute(attrString, CFRangeMake(0, CFAttributedStringGetLength(attrString)), kCTParagraphStyleAttributeName, paragraphStyle); CFRelease(paragraphStyle); NSMutableAttributedString *ret = (NSMutableAttributedString *)attrString; return [ret autorelease]; }

HTH.


Tengo una solución mucho más fácil, que puede o no funcionar para usted.

Si no está haciendo nada especial con CATextLayer que no puede hacer un UILabel, en su lugar, haga un CALayer y agregue la capa de UILabel al CALayer

UILabel*label = [[UILabel alloc]init]; //Do Stuff to label CALayer *layer = [CALayer layer]; //Set Size/Position [layer addSublayer:label.layer]; //Do more stuff to layer