NSAttributedString drawRect不在Mojave上在屏幕上绘制图像

时间:2018-11-01 17:51:26

标签: nsattributedstring macos-mojave nstextattachment drawinrect

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

再次,这种现象似乎只发生在莫哈韦沙漠!预先感谢您的帮助。

0 个答案:

没有答案