3

我有一个将 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)];

同样,这种行为似乎只发生在莫哈韦!提前感谢您的帮助。

4

0 回答 0