gpt4 book ai didi

objective-c - 如何手动创建动态(深色/浅色)NSImage 实例?

转载 作者:太空狗 更新时间:2023-10-30 03:53:05 25 4
gpt4 key购买 nike

在 macOS 10.14 Mojave 中,创建自动绘制明暗版本的 NSImage 实例的唯一方法是通过 Assets 目录和 +[NSImage imageNamed:] .但是,我需要在运行时创建动态图像,而且似乎没有不使用私有(private) API 的方法。

在幕后,似乎一个私有(private)属性 _appearanceName 被引入到 NSImageRep 中,它以某种方式用于选择正确的表示。使用具有相应 _appearanceName 集的图像表示创建 NSImage 应该很简单,但我想避免这种情况。

我找到了一个简单的解决方法(在下面发布)但是当系统外观发生变化时(即用户从浅色切换到深色或反之亦然)或者在具有 appearance 属性设置为不同的外观(例如,一个 View 硬编码为暗模式,另一个 View 硬编码为亮模式)。

那么,我怎样才能手动创建一个动态的 NSImage 来正确显示浅色或深色版本,就像 Assets 目录图像那样?


@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

最佳答案

呃,结果问题中发布的代码工作得很好!绘图处理程序实际上会在适当的时候调用,并且确实处理所有外观情况。

但是,我有缩放和缓存这些图像的代码,它仍在使用古老的[image lockFocus]; … [image unlockFocus]; 绘制图像的方式,而不是使用 +[NSImage imageWithSize:flipped:drawingHandler:]

关于objective-c - 如何手动创建动态(深色/浅色)NSImage 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52849332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com