Есть ли стандартный способ реализации "синего значка" в iPhone?
Многие приложения iPhone используют синий значок для указания количества элементов в подзаголовках, таких как почтовый клиент:
iPhoto http://img.skitch.com/20081103-tjr9yupbhgr3sqfh7u56if4rsn.preview.jpg
Есть ли какой-либо стандарт (или даже API) для этого?
UPDATE: для этого я создал класс BlueBadge. Он доступен в http://github.com/leonho/iphone-libs/tree/master
Ответы
Ответ 1
Насколько мне известно, для этого нет 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];
Ответ 2
Я думаю, что лучший способ реализовать что-то очень близкое к значку UITabBarItem
- это использовать метод UIImage stretchableImageWithLeftCapWidth:topCapHeight:
, где обе заглушки могут быть более привлекательным изображением, а средний будет автоматически растягиваться (используя широкоэкранное изображение 1px) чтобы соответствовать размеру NSString
, который будет наложен сверху.
По-прежнему нужно получать правильные изображения, но это можно легко извлечь из скриншота или создать из PS.
Ответ 3
Вы можете сделать это легко и гибко, используя простой 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.
Ответ 4
В классе NSBezierPath есть несколько методов, называемых "appendBezierPathWithRoundedRect....".
Я даже не проверял их, но они могли бы работать. Это стоит попробовать.
Ответ 5
Существует еще один тип значка, который вы уже знаете, это "красный", который находится на значке приложения. Они создаются, делая что-то вроде:
NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
NSString *caldate = [[now
dateWithCalendarFormat:@"%b"
timeZone:nil] description];
[self setApplicationBadge:caldate];"
это установит значок с аббревиатурой 3-х букв за текущий месяц.