我有一个可以将NSAttributedStrings绘制到自定义视图中的应用程序。 NSAttributedStrings可以包含嵌入式图像。这适用于Mojave之前的macOS版本。该应用程序可以在屏幕上显示字符串,进行打印并将其保存到图像文件中。
这显然在莫哈韦沙漠时期被打破了。奇怪的是,打印并保存到图像文件仍然有效;但在屏幕上,字符串仅显示文本,而不显示嵌入的图像。图像留有适当的空间,但是该空间为空白。
我已经通过构建一个小型应用程序进行了测试,该应用程序显示带有NSTextField(标签)和自定义视图的窗口。它使单个NSAttributedString具有嵌入式图像。它将字符串应用于标签的attributedStringValue,并在自定义视图的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)];
再次,这种现象似乎只发生在莫哈韦沙漠!预先感谢您的帮助。