如果我有一个使用模板图像的NSButton,我如何像Apple在Xcode中那样着色它?
答案 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人员。只是相信工具和自动化可以节省我们宝贵的开发时间)