2008-11-03 12 views
19

Wiele iPhone apps użyć niebieską odznakę aby wskazać liczbę elementów w subviews, takich jak klient poczty:Czy istnieje jakiś standardowy sposób implementacji "niebieskiej odznaki" w telefonie iPhone?

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

Czy istnieje jakiś sposób normy (lub nawet API) to zrobić?

AKTUALIZACJA: W tym celu utworzyłem klasę o nazwie BlueBadge. Jest dostępny pod adresem http://github.com/leonho/iphone-libs/tree/master

Odpowiedz

22

Według mojej wiedzy nie ma na to API. Jednakże, używając CoreGraphics (NSBezierPath nie jest dostępna na iPhonie), możesz to zrobić całkiem łatwo. To tylko dwa łuki w A CGPath i jakiś tekst:

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

Dzięki Ben. Dokładnie tego potrzebuję. – leonho

0

Istnieje kilka metod w klasie NSBezierPath o nazwie "appendBezierPathWithRoundedRect ....".

Ja sam ich nie wypróbowałem, ale mogą one zadziałać. Warto spróbować.

-7

Istnieje również inny rodzaj znaczka, który być może już wiesz, jest "czerwony" na ikonie aplikacji. Są tworzone przez zrobienie czegoś takiego:

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

to ustawi znaczek z 3-literowym skrótem dla bieżącego miesiąca.

3

myślę lepszy sposób zaimplementować coś bardzo blisko UITabBarItem odznaki jest użycie metody UIImage stretchableImageWithLeftCapWidth:topCapHeight: gdzie obie zaślepki może być bardziej elegancki wizerunek i środkowa będzie rozciągany automatycznie (przy użyciu szerokiego obrazu 1px), aby pasował do rozmiaru NSString, który zostałby nałożony na wierzchu.

Nadal trzeba uzyskać odpowiednie obrazy, ale można je łatwo wyciągnąć ze zrzutu ekranu lub skonstruować z PS.

1

Można to zrobić łatwo i elastycznie za pomocą prostego UILabel i zmieniając cornerRadius jej pod nią warstwy:

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

Można użyć mój (mały i prosty) code for a BadgeLabel class and a matching BadgeTableViewCell class.