NSAttributedString drawRect не рисует изображения на экране в Мохаве - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть рабочее приложение, которое рисует NSAttributedStrings в пользовательском представлении. NSAttributedStrings могут включать встроенные изображения. Это работает на версиях macOS до Mojave. Приложение может отображать строки на экране, распечатывать их и сохранять в графических файлах.

Это явно сломано при Мохаве. Странно, печать и сохранение в графических файлах все еще работает; но на экране строки отображают только текст, а не внедренные изображения. Для изображений остается свободное место, но это место пустое.

Я протестировал, создав небольшое приложение, которое показывает окно с NSTextField (меткой) и пользовательским представлением. Создает одну NSAttributedString со встроенным изображением. Он применяет эту строку к attribuStStringValue метки, а также вызывает drawInRect: для той же строки в drawRect: метод пользовательского представления. В метке строка отображается правильно, изображение и все. Но в пользовательском представлении отображается только текст, и место, где должно быть изображение, пусто.

Кто-нибудь понял, почему это происходит в Мохаве, а не в более ранних версиях 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)];

Опять же, такое поведение, кажется, происходит только в Мохаве! Заранее благодарен за любую помощь.

...