Ancho de píxel del texto en un UILabel

78

Necesito dibujar un UILabel tachado. Por lo tanto, subclasé 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 se tacha con una línea que es tan larga como toda la etiqueta, pero el texto puede ser más corto. ¿Hay alguna forma de determinar la longitud del texto en píxeles, de modo que la línea se pueda dibujar correctamente?

También estoy abierto a cualquier otra solución, si la conozco :)

Mejor, Erik

Erik
fuente

Respuestas:

195

NSString tiene un método sizeWithAttributes: que se puede utilizar 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 :)

Harry
fuente
5
sizeWithFont está en desuso desde iOS7. Utilice CGSize textSize = [string sizeWithAttributes: @ {NSFontAttributeName: [UIFont systemFontOfSize: 14.0f]}]; en lugar.
cldrr
También puede utilizar label.attributedText.size.
Jed Fox
70

Una mejor solución, aquí en Swift :
Actualización:
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)")

Respuesta anterior:

yourLabel?.text = "Test label text" // sample label text
let labelTextWidth = yourLabel?.intrinsicContentSize().width
let labelTextHeight = yourLabel?.intrinsicContentSize().height
Aks
fuente
¿Es este ios 7 compatible?
Matej
Esta opción es significativamente más rápida
Josh Bernfeld
Pregunta nueva ... ¿No necesitas un ancho / alto para crear una etiqueta? Al menos ahí es donde estoy. Intento encontrar el ancho del texto con el que estoy creando una etiqueta. let sanskritLabel = UILabel(frame: CGRectMake(0, 120, sanskritStringSize.width, sanskritStringSize.height))
viaje
0

Esto funcionará. Intentalo

NSDictionary *attrDict = @{NSFontAttributeName : [GenericUtility getOpenSansRegularFontSize:12]};
CGSize stringBoundingBox = [selectedReservationModel.DateLabel sizeWithAttributes: attrDict];
lblDeliveryDateWidth = stringBoundingBox.width;
sametytmz
fuente