Генератор изображений (метод generateCGImagesAsynchronouslyForTimes) не дает живых результатов
Довольно новичок в разработке какао и действительно застрял с, вероятно, фундаментальной проблемой.
Короче говоря, мой интерфейс приложения выглядит как простое окно с nsslider внизу. Мне нужно сгенерировать N изображений и поместить их в N nsview в окне моего приложения.
Что он делает до сих пор:
- Я нажимаю на слайдер (удерживая его) и перетаскиваю его. Во время перетаскивания ничего не происходит с моими видами (картинки не генерируются). Когда я отпускаю ползунок, изображения генерируются, и мой взгляд заполняется ими.
Что я хочу: - Мне нужно, чтобы представления были заполнены фотографиями, когда я перемещаю ползунок.
Я обнаружил небольшой флажок в свойствах NSSlider, который является непрерывным, и я его использую, но мой генератор изображений по-прежнему ничего не делает, пока я не отпущу ползунок.
Вот мой код:
// slider move action
- (IBAction)sliderMove:(id)sender
{
[self generateProcess:[_slider floatValue];
}
// generation process
- (void) generateProcess:(Float64) startPoint
{
// create an array of times for frames to display
NSMutableArray *stops = [[NSMutableArray alloc] init];
for (int j = 0; j < _numOfFramesToDisplay; j++)
{
CMTime time = CMTimeMakeWithSeconds(startPoint, 60000);
[stops addObject:[NSValue valueWithCMTime:time]];
_currentPosition = initialTime; // set the current position to the last frame displayed
startPoint+=0.04; // the step between frames is 0.04sec
}
__block CMTime lastTime = CMTimeMake(-1, 1);
__block int count = 0;
[_imageGenerator generateCGImagesAsynchronouslyForTimes:stops
completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime,AVAssetImageGeneratorResult result, NSError *error)
{
if (result == AVAssetImageGeneratorSucceeded)
{
if (CMTimeCompare(actualTime, lastTime) != 0)
{
NSLog(@"new frame found");
lastTime = actualTime;
}
else
{
NSLog(@"skipping");
return;
}
// place the image onto the view
NSRect rect = CGRectMake((count+0.5) * 110, 500, 100, 100);
NSImageView *iView = [[NSImageView alloc] initWithFrame:rect];
[iView setImageScaling:NSScaleToFit];
NSImage *myImage = [[NSImage alloc] initWithCGImage:image size:(NSSize){50.0,50.0}];
[iView setImage:myImage];
[self.windowForSheet.contentView addSubview: iView];
[_viewsToRemove addObject:iView];
}
if (result == AVAssetImageGeneratorFailed)
{
NSLog(@"Failed with error: %@", [error localizedDescription]);
}
if (result == AVAssetImageGeneratorCancelled)
{
NSLog(@"Canceled");
}
count++;
}];
}
}
Если у вас есть какие-либо мысли или идеи, пожалуйста, поделитесь со мной, я буду очень признателен!
Спасибо
1 ответ
Чтобы сделать ваш NSSlider непрерывным, откройте окно контроллера XIB
файл в Интерфейсном Разработчике и нажмите на NSSlider
, Затем откройте область Утилиты
выберите инспектор атрибутов
и установите флажок "Непрерывный"
под заголовком Control. Как только вы это сделали, ваш IBAction
sliderMove:
будет вызываться при перемещении ползунка, а не после отпускания мыши.
Примечание: в качестве альтернативы, с
NSSlider *slider = //...
можно просто позвонить
[slider setContinuous:YES];