94 votes

Texte souligné dans UIlabel

Comment puis-je souligner un texte qui pourrait être de plusieurs lignes de chaîne? Je trouve certaines personnes suggèrent UIWebView, mais il est évidemment trop lourds une classe juste pour le rendu du texte.

Mes pensées était de comprendre le point de départ et la longueur de chaque chaîne dans chaque ligne. Et de tracer une ligne sous en conséquence.

Je rencontre des problèmes à la façon de déterminer la durée et point de départ de la chaîne. Quelqu'un peut-il m'aider sur ce point?

J'ai essayé d'utiliser -[UILabel textRectForBounds:limitedToNumberOfLines:], ce qui devrait être le dessin de délimitation rect pour le texte à droite? Puis-je travailler sur l'alignement? Comment puis-je obtenir le point de départ de chaque ligne quand il est justifié à droite et justifiée?

Je suis nouveau ici, donc je vous remercie à l'avance.

138voto

kovpas Points 5685

Vous pouvez sous-classe de UILabel et de redéfinir la méthode drawRect:

- (void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(ctx, 207.0f/255.0f, 91.0f/255.0f, 44.0f/255.0f, 1.0f); // RGBA
    CGContextSetLineWidth(ctx, 1.0f);

    CGContextMoveToPoint(ctx, 0, self.bounds.size.height - 1);
    CGContextAddLineToPoint(ctx, self.bounds.size.width, self.bounds.size.height - 1);

    CGContextStrokePath(ctx);

    [super drawRect:rect];  
}

UPD:
Comme d'iOS 6, Apple a ajouté NSAttributedString soutien pour UILabel, alors maintenant, il est beaucoup plus facile et travaille pour plusieurs lignes:

NSDictionary *underlineAttribute = @{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:@"Test string" 
                                                         attributes:underlineAttribute];

Si vous souhaitez soutenir iOS 4 et iOS 5, je vous recommande d'utiliser TTTAttributedLabel plutôt que de souligner l'étiquette manuellement. Toutefois, si vous avez besoin de souligner une ligne UILabel et ne voulez pas utiliser de composants tiers, code ci-dessus doit encore faire l'affaire.

38voto

Sana Points 113

C'est ce que j'ai fait. Cela fonctionne comme du beurre.

1) Ajoutez CoreText.framework à vos cadres.

2) importez <CoreText / CoreText.h> dans la classe où vous avez besoin d’un libellé souligné.

3) Écris le code suivant.

     NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@"My Messages"];
    [attString addAttribute:(NSString*)kCTUnderlineStyleAttributeName
              value:[NSNumber numberWithInt:kCTUnderlineStyleSingle]
              range:(NSRange){0,[attString length]}];
    self.myMsgLBL.attributedText = attString;
    self.myMsgLBL.textColor = [UIColor whiteColor];
 

19voto

Paulo Ferreira Points 151

Utilisez une chaîne d'attribut:

 NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:@"Your String"]
[attrString addAttribute:(NSString*)kCTUnderlineStyleAttributeName 
                   value:[NSNumber numberWithInt:kCTUnderlineStyleSingle] 
                   range:(NSRange){0,[attrString length]}];
 

Et puis écrasez le libellé - (void) drawTextInRect: (CGRect) aRect et restituez le texte de la manière suivante:

 CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrString);
drawingRect = self.bounds;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, drawingRect);
textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL);
CGPathRelease(path);
CFRelease(framesetter);
CTFrameDraw(textFrame, ctx);
CGContextRestoreGState(ctx);
 

Ou mieux encore, au lieu de remplacer, utilisez simplement le label OHAttributedLabel créé par Olivier Halligon.

15voto

Guntis Treulands Points 3354

J'ai combiné certaines des réponses, afin de créer de meilleures (au moins pour mes besoins) UILabel sous-classe, qui prend en charge:

  • texte multiligne avec l'étiquette divers limites (texte peut être dans le milieu de l'étiquette de l'image, ou la taille exacte)
  • souligner
  • barré
  • soulignons/barré décalage de ligne
  • l'alignement du texte
  • différentes tailles de police

https://github.com/GuntisTreulands/UnderLineLabel

11voto

karim Points 4704

Les personnes qui ne souhaitent pas sous-classer la vue (UILabel / UIButton), etc., etc.

 -(void) drawUnderlinedLabel {
    NSString *string = [forgetButton titleForState:UIControlStateNormal];
    CGSize stringSize = [string sizeWithFont:forgetButton.titleLabel.font];
    CGRect buttonFrame = forgetButton.frame;
    CGRect labelFrame = CGRectMake(buttonFrame.origin.x + buttonFrame.size.width - stringSize.width, 
            buttonFrame.origin.y + stringSize.height + 1 , 
            stringSize.width, 2);
    UILabel *lineLabel = [[UILabel alloc] initWithFrame:labelFrame];
    lineLabel.backgroundColor = [UIColor blackColor];
    //[forgetButton addSubview:lineLabel];
    [self.view addSubview:lineLabel];
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X