NSImageView с измененным размером не перерисовывается - PullRequest
7 голосов
/ 12 августа 2011

У меня есть NSImageView, который загружает изображение из пакета приложения.

Это так:

coverImage.image = [NSImage imageNamed:@"themeSignEnd.png"];
coverImage.imageScaling = NSImageScaleNone;
coverImage.imageAlignment = NSImageAlignLeft;

Изображение отображается очень хорошо.

Размер NSImageView рассчитывается на основе нескольких других факторов, а затем устанавливается с использованием этого кода:

coverImage.frame = CGRectMake((1280 - 869) / 2, 0, 869 * percentage, 800);

Это прекрасно работает при первом запуске (при запуске приложения).

NSImageView принимает размер, и содержащееся в нем изображение обрезается по соответствующей границе.

К сожалению, когда я пытаюсь изменить размер NSImageView во время работы приложения (используя тот же код, что и выше), оно не будет заметно обновляться.

NSLogging coverImage.frame показывает, что сам фрейм обновлен правильно. Однако вид, кажется, не перерисовывается - ни при уменьшении, ни при увеличении кадра. Кроме того, когда я закрываю и перезапускаю приложение, NSImageView рисует правильную границу.

Что может вызвать такое поведение?

Возможно ли, что NSImageView просто не перерисовывается? Если так, как я могу заставить перерисовку?

Существуют ли какие-то другие особенности NSImageView, которые я пропустил и которые могут привести к такому поведению?

редактирование:

Оказывается, эта ошибка возникает, только если для свойства ImageFrameStyle установлено значение NSImageFrameNone. Если для фрейма установлено что-то еще, оно перерисовывается просто отлично. К сожалению, нам нужно, чтобы изображение отображалось без рамки.

Есть ли разница в рендеринге для NSImageViews с кадрами и без них, которые могут это объяснить?

Ответы [ 4 ]

5 голосов
/ 19 ноября 2013

У меня была очень похожая проблема со свойством NSImageView imageFrameStyle, установленным на NSImageFrameNone. Случилось так, что проблема была в настройках Auto-Layout. Вы можете проверить мой вопрос здесь: NSImageView не будет уменьшать изображение, если стиль фрейма NSImageFrameNone

1 голос
/ 13 августа 2011

Так что я нашел способ обойти это, однако это довольно хакерский.

Как упомянуто в редактировании, эта ошибка возникает только с ImageFrameStyle, установленным в NSImageFrameNone. Когда я устанавливаю ImageFrameStyle на что-то другое, затем изменяю его размер, затем снова устанавливаю его на NSImageFrameNone после изменения размера, все работает нормально:

[coverImage setImageFrameStyle: NSImageFramePhoto];
coverImage.frame = CGRectMake((1280 - 869) / 2, 0, 869 * percentage, 800);
[coverImage setImageFrameStyle: NSImageFrameNone];

Это работает, но не очень красиво. Поэтому я оставлю вопрос открытым еще на пару дней в надежде найти лучший ответ.

0 голосов
/ 11 июля 2013

Я столкнулся с неожиданным поведением при использовании представлений со слоями.В этих типах представлений слой кэширует то, что рисуется, включая изображения, что приводит к неожиданному поведению.Посмотрите, как установлено свойство wantLayer вашего NSView, чтобы узнать, включена ли поддержка слоев.

0 голосов
/ 13 августа 2011

Возможно ли, что NSImageView просто не перерисован? Если так, как я могу заставить перерисовку?

Попробуйте [imageView setNeedsDisplay: YES].

...