Есть ли какой-нибудь стандартный способ реализовать «синий значок» в iPhone? - PullRequest
19 голосов
/ 03 ноября 2008

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

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

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

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

Ответы [ 5 ]

22 голосов
/ 03 ноября 2008

Насколько мне известно, для этого нет 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];
3 голосов
/ 05 декабря 2008

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

Еще нужно получить правильные изображения, но их можно легко извлечь из скриншота или сконструировать из PS.

1 голос
/ 18 февраля 2012

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

0 голосов
/ 03 ноября 2008

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

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

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

0 голосов
/ 03 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...