我有一个将 NSAttributedStrings 绘制到自定义视图中的工作应用程序。NSAttributedStrings 可以包含嵌入的图像。这适用于 Mojave 之前的 macOS 版本。该应用程序可以在屏幕上显示字符串、打印它们并将它们保存到图像文件中。
这显然在莫哈韦沙漠中被打破了。奇怪的是,打印和保存到图像文件仍然有效;但在屏幕上,字符串只显示文本而不显示嵌入的图像。为图像留下了适当的空间,但该空间是空白的。
我通过构建一个小应用程序进行了测试,该应用程序显示一个带有 NSTextField(标签)和自定义视图的窗口。它使用嵌入的图像制作单个 NSAttributedString。它将该字符串应用于标签的属性字符串值,并且还在自定义视图的 drawRect: 方法中对同一字符串调用 drawInRect:。在标签中,字符串正确显示,图像和所有。但是在自定义视图中,只出现了文本,而图像应该是空白的空间。
有人知道为什么在 Mojave 上会发生这种情况,但在早期版本的 macOS 上却没有吗?
这是生成字符串的代码(并将其缓存以供重复使用):
static NSMutableAttributedString* sgAttrString = nil;
/*
* Creates an attributed string the first time it's called,
* then returns that same string each time it's called.
*/
+ (NSAttributedString*)getAttributedString
{
if (sgAttrString == nil)
{
NSFont* font = [NSFont fontWithName:@"Helvetica" size:24.0];
NSDictionary *attrs = @{
NSFontAttributeName: font
};
sgAttrString = [[NSMutableAttributedString alloc] initWithString:@"Daisy: " attributes:attrs];
NSImage* daisy = [NSImage imageNamed:@"daisy.png"];
[daisy setSize:NSMakeSize(24,24)];
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
// I'm aware that attachment.image is available only on macOS 10.11 and later.
// It's not an issue in my real project.
attachment.image = daisy;
NSMutableAttributedString* imageStr = [[NSMutableAttributedString alloc] init];
[imageStr setAttributedString:[NSAttributedString attributedStringWithAttachment:attachment]];
[sgAttrString appendAttributedString:imageStr];
[sgAttrString appendAttributedString: [[NSAttributedString alloc] initWithString:@" !!" attributes:attrs]];
}
return sgAttrString;
}
以下是将字符串应用于 NSTextField 的代码:
NSAttributedString* str = [Utilities getAttributedString];
self.label.attributedStringValue = str;
这是在自定义 NSView 中绘制字符串的代码:
NSAttributedString* str = [Utilities getAttributedString];
[str drawInRect:NSMakeRect(50,50, 300, 40)];
同样,这种行为似乎只发生在莫哈韦!提前感谢您的帮助。