在macOS 10.14 Mojave中,创建自动绘制明暗版本的NSImage
实例的唯一方法是通过 Assets 目录和+[NSImage imageNamed:]
。但是,我需要在运行时创建动态图像,并且似乎没有不使用私有(private)API的方法。
在幕后,似乎已将私有(private)属性_appearanceName
引入NSImageRep
中,该属性以某种方式用于选择正确的表示形式。用带有相应NSImage
设置的图像表示形式创建_appearanceName
应该很简单,但是我想避免这种情况。
我发现了一个简单的解决方法(在下面发布),但是当系统外观发生变化(即用户从浅色切换到深色或反之亦然)时,或者在将appearance
属性设置为不同的外观(例如,一个 View 硬编码为暗模式,另一 View 硬编码为亮模式)。
因此,如何像 Assets 目录图像一样,手动创建正确显示亮或暗版本的动态NSImage
?
@implementation NSImage (CustomDynamic)
+ (NSImage *)imageWithLight:(NSImage *)light dark:(NSImage *)dark
{
if (@available(macOS 10.14, *)) {
return [NSImage
imageWithSize:light.size
flipped:NO
drawingHandler:^(NSRect dstRect) {
if ([NSImage appearanceIsDarkMode:NSAppearance.currentAppearance]) {
[dark drawInRect:dstRect];
} else {
[light drawInRect:dstRect];
}
return YES;
}
];
} else {
return light;
}
}
+ (BOOL)appearanceIsDarkMode:(NSAppearance *)appearance
{
if (@available(macOS 10.14, *)) {
NSAppearanceName basicAppearance = [appearance bestMatchFromAppearancesWithNames:@[
NSAppearanceNameAqua,
NSAppearanceNameDarkAqua
]];
return [basicAppearance isEqualToString:NSAppearanceNameDarkAqua];
} else {
return NO;
}
}
@end
最佳答案
D'uh,事实证明,问题中发布的代码正常运行!实际上,在适当的时间调用了绘图处理程序,并且该处理程序确实处理了所有外观情况。
但是,我有用于缩放和缓存这些图像的代码,它仍然使用古老的[image lockFocus]; … [image unlockFocus];
绘制图像的方式,而不是使用+[NSImage imageWithSize:flipped:drawingHandler:]
。
关于objective-c - 如何手动创建动态(暗/亮)NSImage实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52849332/