Dar*_*ust 6 cocoa objective-c macos-mojave macos-darkmode
在macOS 10.14 Mojave中,创建NSImage自动绘制浅色和深色版本的实例的唯一方法是通过资产目录和+[NSImage imageNamed:]。但是,我需要在运行时创建动态图像,并且似乎没有不使用私有API的方法。
在引擎盖下,似乎_appearanceName引入了私有财产,该私有财产以NSImageRep某种方式用于选择正确的表示形式。创建NSImage具有相应_appearanceName设置的图像表示形式应该很简单,但是我想避免这种情况。
我发现了一个简单的解决方法(在下面发布),但是当系统外观发生变化(即用户从浅色切换为深色或反之亦然)时,或者在将appearance属性设置为不同的视图层次结构中使用时,它似乎无法正常工作外观(例如,一个视图硬编码为暗模式,另一视图硬编码为亮模式)。
因此,如何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
Run Code Online (Sandbox Code Playgroud)
呃,事实证明问题中发布的代码工作得很好!事实上,绘图处理程序在适当的时间被调用,并且确实处理所有的外观情况。
\n\n然而,我有缩放和缓存这些图像的代码,并且它仍然使用古老的[image lockFocus]; \xe2\x80\xa6 [image unlockFocus];绘制图像的方式而不是使用+[NSImage imageWithSize:flipped:drawingHandler:].
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |