120 votes

Comment faire pour que UILabel affiche le texte décrit?

Tout ce que je veux est un pixel de contour noir autour de mon blanc UILabel texte.

J'ai eu comme la mesure du sous-classement UILabel avec le code ci-dessous, j'ai maladroitement bricolé à partir de quelques tangentiellement liés exemples en ligne. Et cela fonctionne, mais c'est très, très lent (sauf sur le simulateur) et je ne pouvais pas le faire pour centrer le texte verticalement (j'ai donc codé en dur la valeur de y, sur la dernière ligne temporairement). Ahhhh!

void ShowStringCentered(CGContextRef gc, float x, float y, const char *str) {
    CGContextSetTextDrawingMode(gc, kCGTextInvisible);
    CGContextShowTextAtPoint(gc, 0, 0, str, strlen(str));
    CGPoint pt = CGContextGetTextPosition(gc);

    CGContextSetTextDrawingMode(gc, kCGTextFillStroke);

    CGContextShowTextAtPoint(gc, x - pt.x / 2, y, str, strlen(str));
}


- (void)drawRect:(CGRect)rect{

    CGContextRef theContext = UIGraphicsGetCurrentContext();
    CGRect viewBounds = self.bounds;

    CGContextTranslateCTM(theContext, 0, viewBounds.size.height);
    CGContextScaleCTM(theContext, 1, -1);

    CGContextSelectFont (theContext, "Helvetica", viewBounds.size.height,  kCGEncodingMacRoman);

    CGContextSetRGBFillColor (theContext, 1, 1, 1, 1);
    CGContextSetRGBStrokeColor (theContext, 0, 0, 0, 1);
    CGContextSetLineWidth(theContext, 1.0);

    ShowStringCentered(theContext, rect.size.width / 2.0, 12, [[self text] cStringUsingEncoding:NSASCIIStringEncoding]);
}

J'ai juste un sentiment tenace que je suis surplombant un moyen plus simple de faire cela. Peut-être en substituant "drawTextInRect", mais je n'arrive pas à obtenir drawTextInRect pour se plier à ma volonté, à tous malgré la regardant fixement et en fronçant les sourcils vraiment vraiment dur.

167voto

kprevas Points 1702

J'ai pu le faire en redéfinissant drawTextInRect:

 - (void)drawTextInRect:(CGRect)rect {

  CGSize shadowOffset = self.shadowOffset;
  UIColor *textColor = self.textColor;

  CGContextRef c = UIGraphicsGetCurrentContext();
  CGContextSetLineWidth(c, 1);
  CGContextSetLineJoin(c, kCGLineJoinRound);

  CGContextSetTextDrawingMode(c, kCGTextStroke);
  self.textColor = [UIColor whiteColor];
  [super drawTextInRect:rect];

  CGContextSetTextDrawingMode(c, kCGTextFill);
  self.textColor = textColor;
  self.shadowOffset = CGSizeMake(0, 0);
  [super drawTextInRect:rect];

  self.shadowOffset = shadowOffset;

}
 

10voto

MuscleRumble Points 31

Il y a un problème avec la réponse de la mise en œuvre. Dessin d'un texte de l'avc qui a un caractère légèrement différent glyphe largeur de dessiner un texte sans accident vasculaire cérébral, qui peut produire des "uncentered" des résultats. Il peut être corrigé en ajoutant un contour invisible à travers le remplissage du texte.

Remplacer:

CGContextSetTextDrawingMode(c, kCGTextFill);
self.textColor = textColor;
self.shadowOffset = CGSizeMake(0, 0);
[super drawTextInRect:rect];

avec:

CGContextSetTextDrawingMode(context, kCGTextFillStroke);
self.textColor = textColor;
[[UIColor clearColor] setStroke]; // invisible stroke
self.shadowOffset = CGSizeMake(0, 0);
[super drawTextInRect:rect];

Je ne suis pas sûr à 100%, si c'est la vraie affaire, parce que je ne sais pas si self.textColor = textColor; a le même effet qu' [textColor setFill], mais il devrait fonctionner.

Avertissement: je suis le développeur de THLabel.

J'ai publié un UILabel sous-classe il y a un moment, ce qui permet à un plan dans le texte et d'autres effets. Vous pouvez le trouver ici: https://github.com/MuscleRumble/THLabel

6voto

Suran Points 221

Utilisez le code suivant

 label.layer.shadowColor = [[UIColor blackColor] CGColor];
label.layer.shadowOffset = CGSizeMake(0.0f, 1.0f);
label.layer.shadowOpacity = 1.0f;
label.layer.shadowRadius = 1.0f;
 

Je ne sais pas s'il est compatible avec les anciennes versions d'iOS ..

En tout cas, j'espère que ça aide ...

4voto

Nick Cartwright Points 3101

Si vous voulez animer quelque chose de compliqué, le meilleur moyen est de prendre par programme une capture d'écran de celle-ci et de l'animer à la place!

Pour prendre une capture d'écran d'une vue, vous aurez besoin d'un code un peu comme ceci:

 UIGraphicsBeginImageContext(mainContentView.bounds.size);
[mainContentView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
 

Où mainContentView est la vue que vous souhaitez prendre une capture d'écran. Ajoutez viewImage à UIImageView et animez-le.

J'espère que cela accélère votre animation !!

N

4voto

ufmike Points 28

Comme MuscleRumble l'a mentionné, la bordure de la réponse acceptée est un peu décentrée. J'ai pu corriger cela en réglant la largeur du trait sur zéro au lieu de changer la couleur en clair.

c'est à dire remplacer:

 CGContextSetTextDrawingMode(c, kCGTextFill);
self.textColor = textColor;
self.shadowOffset = CGSizeMake(0, 0);
[super drawTextInRect:rect];
 

avec:

 CGContextSetTextDrawingMode(context, kCGTextFillStroke);
self.textColor = textColor;
CGContextSetLineWidth(c, 0); // set stroke width to zero
self.shadowOffset = CGSizeMake(0, 0);
[super drawTextInRect:rect];
 

J'aurais juste commenté sa réponse mais apparemment je ne suis pas assez "digne de confiance".

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