web-dev-qa-db-fra.com

Largeur en pixels du texte dans un UILabel

J'ai besoin de dessiner un UILabel barré. Par conséquent, j'ai sous-classé UILabel et l'ai implémenté comme suit:

@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

Ce qui se passe, c'est que l'UILabel est barré avec une ligne aussi longue que l'intégralité de l'étiquette, mais le texte peut être plus court. Existe-t-il un moyen de déterminer la longueur du texte en pixels, de sorte que la ligne puisse être tracée de manière appropriée?

Je suis également ouvert à toute autre solution, si elle est connue :)

Meilleur, Erik

77
Erik

NSString a une méthode sizeWithAttributes: qui peut être utilisée pour cela. Il renvoie une structure CGSize, vous pouvez donc faire quelque chose de similaire à ce qui suit pour trouver la largeur du texte à l'intérieur de votre étiquette.

iOS 7 et supérieur

CGSize textSize = [[label text] sizeWithAttributes:@{NSFontAttributeName:[label font]}];

CGFloat strikeWidth = textSize.width;

iOS <7

Avant iOS7, vous deviez utiliser la méthode sizeWithFont: .

CGSize textSize = [[label text] sizeWithFont:[label font]];

CGFloat strikeWidth = textSize.width;

UILabel a une propriété de police que vous pouvez utiliser pour obtenir dynamiquement les détails de la police de votre étiquette comme je le fais ci-dessus.

J'espère que cela t'aides :)

194
Harry

Une meilleure solution, ici en Swift:
Mise à jour:
Pour 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)")

Ancienne réponse:

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

j'espère que cet exemple peut vous aider (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];
1
Yong