2012-03-02 31 views
7

A primera vista, mi pregunta parece muy simple, pero parece que realmente no puedo encontrar una solución. Esto es lo que es: Quiero calcular el cuadro delimitador de una cadena CATextLayer. Aquí es lo que hago:¿Cómo se calcula el cuadro delimitador de una cadena CATextLayer?

CATextLayer *textLayer = [CATextLayer layer]; 
textLayer.frame = CGRectMake(80, 0.0f, 36.0f, 18.0f); 
textLayer.string = @"12"; 
textLayer.fontSize = [UIFont systemFontSize]; 
textLayer.foregroundColor = [UIColor whiteColor].CGColor; 

NSLog(@"(width,height)=(%f,%f)", 
[textLayer.string sizeWithFont:textLayer.font].width, 
[textLayer.string sizeWithFont:textLayer.font].height); 

El problema es que la salida es siempre: (anchura, altura) = (8.000000,0.000000)

Respuesta

7

Uso sizeWithFont:constrainedToSize:lineBreakMode:

[someString sizeWithFont:yourFont 
     constrainedToSize:CGSizeMake(maxWidthYouSpecify, CGFLOAT_MAX) 
      lineBreakMode:UILineBreakModeWordWrap]; 
1

// utilizar debajo de función para CATextLayer dinámico

func DynamicLableWidth(reason:NSString,cpT:CGPoint,width:CGFloat,reasonLayer:CATextLayer) 
{ 

    //Dynamic CATextLayer with boundingRect 
    let font = UIFont(name: "Arial", size: 20)! 
    let attributes: [NSString : AnyObject] = [NSFontAttributeName: font] 

    var rect:CGRect = reason.boundingRectWithSize(reasonLayer.frame.size, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attributes, context: nil) 

    var size:CGSize = CGSizeMake(rect.size.width, rect.size.height); 
    if cpT.x+20+ceil(size.width)+20>width 
    { 
     reasonLayer.frame = CGRectMake(cpT.x-20-ceil(size.width)+20, cpT.y-15, ceil(size.width)+20, 20) 
    } 
    else 
    { 
     reasonLayer.frame = CGRectMake(cpT.x+20, cpT.y-15, rect.size.width+20, 20) 
    } 
} 
Cuestiones relacionadas