Есть ли какой-нибудь стандартный способ реализовать синий значок в iPhone?

Во многих приложениях для iPhone используется синий значок для обозначения количества элементов в подпредставлениях, например в почтовом клиенте:

http://skitch.com/leonho/4xeu/iphoto

Есть ли какие-либо стандартные способы (или даже API) для этого?

ОБНОВЛЕНИЕ: для этого я создал класс BlueBadge. Он доступен по адресу http://github.com/leonho/iphone-libs/tree/master


person leonho    schedule 03.11.2008    source источник


Ответы (5)


Насколько мне известно, для этого нет 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];
person Ben Gottlieb    schedule 03.11.2008

Я думаю, что лучший способ реализовать что-то очень близкое к значку UITabBarItem - использовать метод UIImage stretchableImageWithLeftCapWidth:topCapHeight:, при котором обе конечные заглушки могут быть более красивыми, а середина будет растягиваться автоматически (с использованием изображения шириной 1 пиксель), чтобы соответствовать размеру NSString, который накладываться сверху.

По-прежнему нужно получить правильные изображения, но их можно легко извлечь из снимка экрана или создать из PS.

person kleinman    schedule 05.12.2008

Вы можете сделать это легко и гибко, используя простой 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.

person Yonat    schedule 18.02.2012

В классе NSBezierPath есть несколько методов, называемых «appendBezierPathWithRoundedRect ....».

Я сам их не пробовал, но они могут сработать. Стоит попробовать.

person Kristian    schedule 03.11.2008

Существует также другой тип значка, который вы, возможно, уже знаете, это «красный» значок на значке приложения. Они создаются следующим образом:

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

это установит значок с трехбуквенным сокращением текущего месяца.

person Kristian    schedule 03.11.2008