2008-11-03 7 views
19

Viele iPhone-Apps verwenden, um eine blaue Plakette die Anzahl der Elemente in der Subviews, wie der Mail-Client, um anzuzeigen:Gibt es eine Standardmethode, um das "blaue Abzeichen" im iPhone zu implementieren?

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

Gibt es Standards Art und Weise (oder sogar eine API) tun?

UPDATE: Ich habe eine Klasse namens BlueBadge erstellt, um dies zu tun. Es ist verfügbar unter http://github.com/leonho/iphone-libs/tree/master

Antwort

22

Meines Wissens gibt es keine API dafür. Die Verwendung von CoreGraphics (NSBezierPath ist auf dem iPhone nicht verfügbar) ist jedoch ziemlich einfach. Es ist nur zwei Böge in einem CGPath und etwas Text:

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

Dank Ben. Das ist genau das, was ich brauche. – leonho

0

Es gibt einige Methoden in der NSBezierPath-Klasse namens "appendBezierPathWithRoundedRect ....".

Ich habe sie nicht selbst ausprobiert, aber sie könnten funktionieren. Es ist einen Versuch wert.

-7

Es gibt auch einen anderen Typ von Ausweis, den Sie vielleicht schon kennen, der "rote", der auf dem Anwendungssymbol steht. Sie zeichnen sich durch etwas zu tun, wie geschaffen:

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

dies das Abzeichen mit einer 3-Buchstaben-Abkürzung für den aktuellen Monat einstellen.

3

Ich glaube, ein besseren Weg, etwas sehr nah an die UITabBarItem Abzeichen implementieren wird, um die UIImage stretchableImageWithLeftCapWidth:topCapHeight: Methode zu verwenden, bei denen beide Endkappen ein schickes Bild sein könnten und die Mitte wird automatisch gestreckt (mit dem 1px breiten Bild), um die NSString Größe, die überlagert werden würde, anzupassen.

Noch müssen die richtigen Bilder bekommen, aber das könnte leicht von einem Screenshot gezogen werden oder aus PS konstruiert.

1

Sie können es leicht zu tun und flexibel durch eine einfache UILabel mit und die corner seiner underlaying Schicht ändert:

#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; 

Sie können meine (kleine und einfache) code for a BadgeLabel class and a matching BadgeTableViewCell class verwenden.

Verwandte Themen