2008-11-03 7 views
19

Beaucoup d'applications iPhone utiliser un badge bleu pour indiquer le nombre d'éléments dans les sous-vues, comme le client de messagerie:Existe-t-il un moyen standard pour implémenter le "badge bleu" sur iPhone?

iPhoto http://img.skitch.com/20081103-tjr9yupbhgr3sqfh7u56if4rsn.preview.jpg

Existe-t-il un moyen (ou même une API) les normes font cela?

MISE À JOUR: J'ai créé une classe appelée BlueBadge pour cela. Il est disponible à http://github.com/leonho/iphone-libs/tree/master

Répondre

22

À ma connaissance, il n'y a pas d'API pour cela. Cependant, en utilisant CoreGraphics (NSBezierPath n'est pas disponible sur iPhone), vous pouvez le faire assez facilement. Il est juste deux arcs dans un CGPath et un texte:

CGContextRef  context = UIGraphicsGetCurrentContext(); 
float    radius = bounds.size.height/2.0; 
NSString   *countString = [NSString stringWithFormat: @"%d", count]; 

CGContextClearRect(context, bounds); 

CGContextSetFillColorWithColor(context, ovalColor); 
CGContextBeginPath(context); 
CGContextAddArc(context, radius, radius, radius, M_PI/2 , 3 * M_PI/2, NO); 
CGContextAddArc(context, bounds.size.width - radius, radius, radius, 3 * M_PI/2, M_PI/2, NO); 
CGContextClosePath(context); 
CGContextFillPath(context); 

[[UIColor whiteColor] set]; 

UIFont    *font = [UIFont boldSystemFontOfSize: 14]; 
CGSize    numberSize = [countString sizeWithFont: font]; 

bounds.origin.x = (bounds.size.width - numberSize.width)/2; 

[countString drawInRect: bounds withFont: font]; 
+0

Merci Ben. C'est exactement ce dont j'ai besoin. – leonho

0

Il existe quelques méthodes dans la classe NSBezierPath appelées "appendBezierPathWithRoundedRect ....".

Je n'ai pas essayé moi-même, mais ils pourraient fonctionner. Ça vaut la peine d'essayer.

-7

Il y a aussi un autre type de badge que vous savez peut-être, il est une « rouge » qui se trouve sur l'icône de l'application. Ils sont créés en faisant quelque chose comme:

NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0]; 
NSString *caldate = [[now 
     dateWithCalendarFormat:@"%b" 
     timeZone:nil] description]; 
[self setApplicationBadge:caldate];" 

cela va mettre le badge avec une abréviation de 3 lettres pour le mois en cours.

3

Je pense une meilleure façon de mettre en œuvre quelque chose de très proche de l'insigne UITabBarItem est d'utiliser la méthode UIImage stretchableImageWithLeftCapWidth:topCapHeight: où les deux embouts pourraient être une image colombophile et le milieu se strech automatiquement (en utilisant l'image large 1px) pour s'adapter à la taille NSString qui serait superposée sur le dessus.

Encore faut-il obtenir les images appropriées mais qui pourraient être facilement tiré à partir d'une capture d'écran ou construit à partir PS.

1

Vous pouvez le faire facilement et avec souplesse à l'aide d'un simple UILabel et en changeant la cornerRadius de sa couche sous-jacente:

#import <QuartzCore/QuartzCore.h> // don't forget! 
// ... 
UILabel *badge = [[UILabel alloc] init]; 
badge.layer.backgroundColor = [UIColor blueColor].CGColor; 
badge.layer.cornerRadius = badge.bounds.size.height/2; 

Vous pouvez utiliser mon (petit et simple) code for a BadgeLabel class and a matching BadgeTableViewCell class.

Questions connexes