Agregue text a CALayer: drawInRect no funciona

Hice lo siguiente:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { UIGraphicsPushContext ( ctx ); CGRect r = CGRectMake( 500, 300, 200, 100 ); NSString *text = [[NSString alloc] initWithString:@"raaaaaaaa!"]; UIColor *color = [ UIColor colorWithRed: (200.0f) green: (100.0) blue:(200.0f) alpha: 1.0f ]; [color set]; [ text drawInRect: r withFont:[UIFont systemFontOfSize:50] lineBreakMode: UILineBreakModeWordWrap alignment: UITextAlignmentLeft ]; [text release]; UIGraphicsPopContext(); } } } 

El código anterior no funciona. ¿Por qué?

Si hago lo siguiente, está funcionando:

 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { UIGraphicsPushContext ( ctx ); CATextLayer *label = [[CATextLayer alloc] init]; [label setFont:@"Didot"]; [label setFontSize:50]; [label setFrame:CGRectMake( 400, 300, 400, 100 )]; [label setString:@"Helloooooooooooooooooo"]; [label setAlignmentMode:kCAAlignmentCenter]; [label setForegroundColor:[[UIColor blueColor] CGColor]]; [layer addSublayer:label]; [label release]; UIGraphicsPopContext(); } } 

¿Cuál es la diferencia y por qué drawInRect no hace nada?

Gracias

EDITAR Entonces, no estaba usando UIColor correctamente, así que cambié

 UIColor *color = [ UIColor colorWithRed: (200.0f) green: (100.0) blue:(200.0f) alpha: 1.0f ]; 

para esto

 UIColor *color = [UIColor colorWithRed:200 / 255.0 green:100 / 255.0 blue: 200 / 255.0 alpha: 1.0]; 

Aún no hay suerte, no puedo ver ningún text al usar drawInRect

Hay dos preguntas en su pregunta:

El código anterior no funciona. ¿Por qué?

Al principio pensé que el text no aparecía porque estaba dibujado con blanco sobre blanco. Si bien puede haber sido así, ese no es el único problema.

El rectángulo al que está dibujando su text en (r) es relativo a los límites de la capa que está dibujando. Es decir, si desea dibujar en la esquina superior izquierda de la capa, el origen del rectángulo debería ser (0, 0) El código anterior aún no funciona.

Si inspecciona CGSize that drawInRect: withFont: … devuelve (el tamaño del text representado), puede ver que el tamaño del text representado es 0 ancho. Esto es una indicación de que la altura de 100 para que el rectángulo dibuje no es suficiente. El aumento de la altura del rectángulo soluciona esto y ahora el text es visible. Si está dibujando text dentro de una capa, tal vez el rectángulo más sensible para dibujar es los límites de la capa ( CGRect r = [layer bounds]; ).

Lo que hice para que funcione:

  • Color de text modificado
  • Origen cambiado de r a (0,0)
  • Mayor altura de r

Cuál es la diferencia […] ?

En el primero está dibujando text en el context gráfico de la capa (lo que drawLayer: inContext: se supone que debe hacer), pero en el ejemplo de segundos, está agregando otra capa a la jerarquía de la capa en lugar de dibujar dentro de ella. Cada vez que su capa se vuelva a dibujar, se agregará una nueva capa de text. Entonces, nada se dibuja en el context de los charts de capas.

Lo que sucede después, una vez que tu capa se dibujó (vacía), es que las subcapas de tus capas se dibujan y su contenido se compone en la parte superior de tu capa. Es por eso que ve el text de la capa de text.

Si agrega una capa de text como esta, puede hacer que su código sea más eficiente al no tener que hacer ningún dibujo manual. Esto requiere que la capa de text se agregue a tu capa en algún punto anterior (solo una vez) y que no hagas ningún dibujo personalizado (a menudo es lento).

Solo si ha leído la reference de class de UIColor …

 UIColor *color = [UIColor colorWithRed:200 / 255.0 green:100 / 255.0 blue: 200 / 255.0 alpha: 1.0]; 

resolverá tu problema

Es posible que la coorderada de tu cuadro esté mal.

  CGRect r = CGRectMake( 500, 300, 200, 100 ); [label setFrame:CGRectMake( 400, 300, 400, 100 )]; 

Tenga en count que el tamaño de la pantalla del iPhone es 320 * 460 o 3 20 * 568 (iPhone5). En su código, establece la coorderada x 400 y 500 que está más allá de la pantalla.

Tenga en count que su coorderada debe seguir x <= 320 o no puede verlo en la pantalla a less que agregue esto en una vista de desplazamiento