Ancho de píxel del texto en un UILabel

Necesito dibujar un UILabel atravesado. Por lo tanto, clasifiqué UILabel y lo implementé de la siguiente manera:

@implementation UIStrikedLabel - (void)drawTextInRect:(CGRect)rect{ [super drawTextInRect:rect]; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextFillRect(context,CGRectMake(0,rect.size.height/2,rect.size.width,1)); } @end 

Lo que sucede es que el UILabel es atravesado con una línea que es tan larga como toda la etiqueta, pero el texto puede ser más corto. ¿Hay alguna manera de determinar la longitud del texto en píxeles, de forma que la línea se pueda dibujar de forma adecuada?

También estoy abierto a cualquier otra solución, si se sabe 🙂

Mejor, Erik

NSString tiene un método sizeWithAttributes: que se puede usar para esto. Devuelve una estructura CGSize, por lo que podría hacer algo similar a lo siguiente para encontrar el ancho del texto dentro de su etiqueta.

iOS 7 y superior

 CGSize textSize = [[label text] sizeWithAttributes:@{NSFontAttributeName:[label font]}]; CGFloat strikeWidth = textSize.width; 

iOS <7

Antes de iOS7, tenías que usar el método sizeWithFont:

 CGSize textSize = [[label text] sizeWithFont:[label font]]; CGFloat strikeWidth = textSize.width; 

UILabel tiene una propiedad de fuente que puede usar para obtener dinámicamente los detalles de la fuente para su etiqueta como lo estoy haciendo arriba.

Espero que esto ayude 🙂

Una mejor solución, aquí en Swift :
Actualizar:
Para Swift 3/4 :

 @IBOutlet weak var testLabel: UILabel! // in any function testLabel.text = "New Label Text" let width = testLabel.intrinsicContentSize.width let height = testLabel.intrinsicContentSize.height print("width:\(width), height: \(height)") 

Vieja respuesta:

 yourLabel?.text = "Test label text" // sample label text let labelTextWidth = yourLabel?.intrinsicContentSize().width let labelTextHeight = yourLabel?.intrinsicContentSize().height 

Espero que esta muestra te pueda ayudar (iOS> 7)

 NSString *text = @" // Do any additional setup after loading the view, typically from a nib."; CGRect rect = CGRectZero; NSDictionary *attrDict = @{NSFontAttributeName : [UIFont systemFontOfSize:17]}; rect = [text boundingRectWithSize:CGSizeMake(100,9999) options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) attributes:attrDict context:Nil]; UILabel *lbl = [[UILabel alloc] init]; lbl.text = text; rect.origin = CGPointMake(50, 200); lbl.frame = rect; lbl.lineBreakMode = NSLineBreakByWordWrapping; lbl.numberOfLines = 0; [self.view addSubview:lbl];