在iPhone中有没有标准的方法来实现“蓝色徽章”?

时间:2008-11-03 11:26:45

标签: iphone cocoa-touch

许多iPhone应用程序使用蓝色徽章来指示子视图中的项目数,例如Mail客户端:

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

有没有标准方式(甚至是API)这样做?

更新:我创建了一个名为BlueBadge的类来执行此操作。它位于http://github.com/leonho/iphone-libs/tree/master

5 个答案:

答案 0 :(得分:22)

据我所知,这没有API。但是,使用CoreGraphics(iPhone上没有NSBezierPath),您可以非常轻松地完成。它只是CGPath中的两个弧和一些文本:

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

答案 1 :(得分:3)

我认为实现非常接近UITabBarItem徽章的更好方法是使用UIImage stretchableImageWithLeftCapWidth:topCapHeight:方法,其中两个端盖可以是更漂亮的图像,中间将自动拉伸(使用1px宽图像)以适合将覆盖在顶部的NSString大小。

仍然需要获得正确的图像,但可以从屏幕截图轻松拉出或从PS构建。

答案 2 :(得分:1)

通过使用简单的UILabel并更改其底层图层的cornerRadius,您可以轻松灵活地完成此任务:

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

您可以使用我的(小而简单的)code for a BadgeLabel class and a matching BadgeTableViewCell class

答案 3 :(得分:0)

NSBezierPath类中有一些名为“appendBezierPathWithRoundedRect ....”的方法。

我自己没有尝试过,但他们可能会工作。值得一试。

答案 4 :(得分:-7)

您可能已经知道了另一种类型的徽章,它是应用程序图标上的“红色”徽章。它们是通过以下方式创建的:

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

这将为当月设置徽章的3个字母缩写。