如何使用灰色模板图像创建像Xcode这样的彩色按钮

时间:2014-03-03 17:28:00

标签: objective-c cocoa

如果我有一个使用模板图像的NSButton,我如何像Apple在Xcode中那样着色它?

2 个答案:

答案 0 :(得分:0)

没有用于在按钮中着色模板图像的API。在我最近的一个应用程序中,我刚刚写了一个小工厂,它从灰色的工程中动态创建彩色图像。我正在使用核心图像过滤器来快速处理图像。

这是进行着色的工厂的主要方法:

- (NSImage *)imageNamed:(NSString *)name withOptions:(HcToolbarImageOptions)options
{
    NSString *key = [self keyForName:name withOptions:options];
    NSImage *image = _cache[key];
    if (!image) {
        NSImage *sourceImage = [NSImage imageNamed:name];
        NSAssert1(sourceImage != nil, @"Could not find any image named %@", name);
        if (options == 0) {
            image = sourceImage;
        } else {
            image = [NSImage imageWithSize:sourceImage.size flipped:NO drawingHandler:^BOOL(NSRect dstRect) {
                CIContext *context = [[NSGraphicsContext currentContext] CIContext];
                CGContextRef cgContext = [[NSGraphicsContext currentContext] graphicsPort];
                NSRect proposedRect = dstRect;
                CGImageRef cgImage = [sourceImage CGImageForProposedRect:&proposedRect context:[NSGraphicsContext currentContext] hints:nil];
                CIImage *result = [CIImage imageWithCGImage:cgImage];
                if (options & HcToolbarImage_Enabled) {
                    CIFilter *filter1 = [CIFilter filterWithName:@"CIGammaAdjust"];
                    [filter1 setDefaults];
                    [filter1 setValue:result forKey:kCIInputImageKey];
                    [filter1 setValue:@0.6 forKey:@"inputPower"];
                    result = [filter1 valueForKey:kCIOutputImageKey];
                    CIFilter *filter2 = [CIFilter filterWithName:@"CIColorMonochrome"];
                    [filter2 setDefaults];
                    [filter2 setValue:result forKey:kCIInputImageKey];
                    [filter2 setValue:@1.0f forKey:kCIInputIntensityKey];
                    [filter2 setValue:[CIColor colorWithRed:0.2 green:0.5 blue:1.0] forKey:kCIInputColorKey];
                    result = [filter2 valueForKey:kCIOutputImageKey];
                }
                CGRect extent = [result extent];
                CGImageRef finalImage = [context createCGImage:result fromRect:extent];
                if (options & HcToolbarImage_NotKeyWindow) {
                    CGContextSetAlpha(cgContext, 0.5);
                }
                CGContextDrawImage(cgContext, dstRect, finalImage);
                return YES;
            }];
        }
        [_cache setObject:image forKey:key];
    }
    return image;
}

最终图片缓存在NSMutableDictionary

答案 1 :(得分:0)

再一次 - 如果您正在使用PaintCode之类的自己的工具,可以节省大量时间。

(和 nope ,仍然没有任何关联的PaintCode人员。只是相信工具和自动化可以节省我们宝贵的开发时间)