Получение NSImage от NSProgressIndicator - PullRequest
5 голосов
/ 04 ноября 2008

Мне нужно поместить изображение из NSProgressIndicator в ячейку NSOutlineView. Я написал код, который делает это для детерминированного индикатора, и он прекрасно работает:

NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0, 0, 16, 16)];
[progressIndicator setStyle:NSProgressIndicatorSpinningStyle];          
[progressIndicator setIndeterminate:NO];
[progressIndicator setMaxValue:100.0];
[progressIndicator setDoubleValue:somePercentage];          

NSImage *updateImage = [[NSImage alloc] initWithData:[progressIndicator dataWithPDFInsideRect:[progressIndicator frame]]];
[progressIndicator release];


return [updateImage autorelease];

Я попытался изменить код, чтобы он также давал мне неопределенные изображения индикаторов. Однако для неопределенного случая я всегда получаю пустое изображение 16x16. (Я подтвердил это, записав изображение в файл в каждом случае, определенный случай дает мне изображение индикатора прогресса, неопределенный случай всегда - белый квадрат 16x16).

Модифицированный код:

if(self.lengthUnknown)
{
    NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0, 0, 16, 16)];
    [progressIndicator setStyle:NSProgressIndicatorSpinningStyle];          
    [progressIndicator setIndeterminate:YES];

    NSImage *updateImage = [[NSImage alloc] initWithData:[progressIndicator dataWithPDFInsideRect:[progressIndicator frame]]];
    [progressIndicator release];


    return [updateImage autorelease];
}
else
{
 // Same code as the first listing, this case works fine
}

Используют ли неопределенные индикаторы хода выполнения какой-либо тип рисунка, который вызывает -dataWithPDFInsideRect: быть неспособным захватить их изображение?


Дополнительная информация: я пытался настроить индикатор прогресса так, чтобы он не использовал многопоточную анимацию, а также пытался захватить содержимое с помощью метода lockFocus от NSImage, как предложено ниже, но ни одна из этих попыток не имела значения.

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

Ответы [ 2 ]

5 голосов
/ 04 ноября 2008

Я использовал AMIndeterminateProgressIndicatorCell для неопределенных индикаторов прогресса в ячейках. Это не настоящий NSProgressIndicator, так как он делает свой собственный чертеж, но это довольно хорошая копия, IMO.

альтернативный текст http://www.harmless.de/images/progressindicator.png?harmless=e55652fb0a6b5e2d88a22e9b37c9bbc1

2 голосов
/ 04 ноября 2008

Индикаторы хода выполнения используют фоновый поток, чтобы сохранить анимацию, даже если основной поток занят чем-то другим, поэтому, возможно, именно это и является причиной проблемы. Вы можете попробовать вызвать setUsesThreadedAnimation: NO на индикаторе прогресса перед тем, как начать рисовать, чтобы увидеть, имеет ли это значение.

Другим тактом было бы создать пустой NSImage, а затем вызвать метод drawRect: индикатора прогресса, чтобы отобразить его содержимое в буфере изображений. Это будет выглядеть примерно так:

NSProgressIndicator* progressIndicator;
NSImage* image = [[NSImage alloc] initWithSize:[progressIndicator bounds].size];
[image lockFocus];
[progressIndicator drawRect:[progressIndicator bounds]];
[image unlockFocus];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...