0

对可可开发来说还很陌生,并且确实遇到了一个基本问题。

简而言之,我的应用程序 UI 看起来像一个底部带有 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++;
     }];
}

}

如果您有任何想法或想法,请与我分享,我将非常感激!

谢谢

4

1 回答 1

0

为了使您的 NSSlider 连续,请XIB在 Interface Builder 中打开窗口控制器的文件,然后单击NSSlider. 然后,打开实用程序区域

公用事业区

选择属性检查器

属性检查器

并选中“连续”复选框

在控制标题下连续检查

在控制标题下。完成此操作后,您IBAction sliderMove:将在滑块移动时调用,而不是在释放鼠标时调用。

注意:或者,使用

NSSlider *slider = //...

可以简单地调用

[slider setContinuous:YES];
于 2012-11-07T03:49:41.117 回答