如何在NSView(Mac OS X)上显示徽章

时间:2013-11-06 15:36:45

标签: objective-c macos cocoa badge nsdocktile

要在停靠栏中为您的应用添加徽章很简单,只需拨打[NSDockTile setBadgeLabel]即可。但我想为通用NSView添加徽章。有没有办法做到这一点?或者如果不这样做,你如何绘制一个以使其与系统UI的其余部分保持一致?

2 个答案:

答案 0 :(得分:4)

没有内置方法可以在NSView上绘制徽章,因此您应该自己绘制徽章。 这是我绘制徽章的代码:

- (void)drawBadgeImageWithText:(NSString*)text atPoint:(NSPoint)point
{
    NSSize badgeSize = [self badgeSizeForString:text];
    NSRect badgeRect = NSMakeRect(point.x - badgeSize.width, point.y - badgeSize.height, badgeSize.width, badgeSize.height);

    [NSGraphicsContext saveGraphicsState];

    // Set a shadow
    NSShadow* shadow = [[NSShadow alloc] init];
    shadow.shadowColor = [[NSColor blackColor] colorWithAlphaComponent:0.4];
    shadow.shadowBlurRadius = 1;
    shadow.shadowOffset = NSMakeSize(0, -1);
    [shadow set];

    // Draw white border
    NSBezierPath* path = [NSBezierPath bezierPathWithRoundedRect:badgeRect xRadius:badgeSize.height / 2.0 yRadius:badgeSize.height / 2.0];
    [[NSColor whiteColor] setFill];
    [path fill];

    [NSGraphicsContext restoreGraphicsState];

    // Fill the background with red gradient 
    badgeRect = NSInflateRect(badgeRect, -1.5, -1.5);
    path = [NSBezierPath bezierPathWithRoundedRect:badgeRect xRadius:badgeSize.height / 2.0 yRadius:badgeSize.height / 2.0];
    [[NSColor colorWithCalibratedRed:192.0 / 255.0 green:0.0 blue:0.0 alpha:1.0] setFill];
    [path fill];

    NSGradient* gradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedRed:241.0 / 255.0 green:113.0 / 255.0 blue:115.0 / 255.0 alpha:1.0]
                                                         endingColor:[NSColor colorWithCalibratedRed:192.0 / 255.0 green:0.0 blue:0.0 alpha:1.0]];
    [gradient drawInBezierPath:path angle:-90.0];

    // Draw the text
    NSMutableParagraphStyle* paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setAlignment:NSCenterTextAlignment];

    NSDictionary* textAttributes = @{NSForegroundColorAttributeName:[NSColor whiteColor], NSParagraphStyleAttributeName:paragraphStyle};

    [text drawInRect:badgeRect withAttributes:textAttributes];
}

- (NSSize)badgeSizeForString:(NSString*)string
{
    NSDictionary* attributes = [NSDictionary dictionaryWithObject:[NSFont systemFontOfSize:13] forKey: NSFontAttributeName];
    NSSize size = [string sizeWithAttributes:attributes];

    // Paddings
    size.height += 2.0;
    size.width += 12.0;

    return size;
}

答案 1 :(得分:0)

我移植了Dmitry对Swift 3的回答;在这里它是为了节省其他人一些时间。

8:04:20 PM - info: /api/v2 200
8:04:22 PM - info: /api/v2/asdf 200