Во многих приложениях для iPhone используется синий значок для обозначения количества элементов в подпредставлениях, например в почтовом клиенте:
iPhoto http://img.skitch.com/20081103-tjr9yupbhgr3sqfh7u56if4rsn.preview.jpg
Есть ли какие-либо стандартные способы (или даже API) для этого?
ОБНОВЛЕНИЕ: для этого я создал класс BlueBadge. Он доступен по адресу http://github.com/leonho/iphone-libs/tree/master





В классе NSBezierPath есть несколько методов, называемых «appendBezierPathWithRoundedRect ....».
Я сам их не пробовал, но они могут сработать. Стоит попробовать.
Существует также другой тип значка, который вы, возможно, уже знаете, это «красный» значок на значке приложения. Они создаются следующим образом:
NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
NSString *caldate = [[now
dateWithCalendarFormat:@"%b"
timeZone:nil] description];
[self setApplicationBadge:caldate];"
это установит значок с трехбуквенным сокращением текущего месяца.
Насколько мне известно, для этого нет API. Однако с помощью CoreGraphics (NSBezierPath недоступен на iPhone) вы можете сделать это довольно легко. Это всего лишь две дуги в 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];
Я думаю, что лучший способ реализовать что-то очень близкое к значку UITabBarItem - это использовать метод UIImage stretchableImageWithLeftCapWidth:topCapHeight:, при котором обе торцевые крышки могут быть более красивым изображением, а середина будет автоматически растягиваться (с использованием изображения шириной 1 пиксель), чтобы соответствовать размеру NSString, который накладываться сверху.
По-прежнему нужно получить правильные изображения, но их можно легко извлечь из снимка экрана или создать из PS.
Вы можете сделать это легко и гибко, используя простой 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;
Можете использовать мой (маленький и простой) код для класса BadgeLabel и соответствующего класса BadgeTableViewCell.