我真的需要帮助。
我正在创建简单的图像处理应用程序,我从相机胶卷加载图像或拍照。我有一个亮度控制(滑块),可以调整图像的亮度。问题是滑块在模拟器上实时工作,但在ipad上响应有很小的延迟。我已经尝试了一切,但似乎没有运气。
请帮忙。我已经看到其他应用程序滑块工作顺利,没有任何延迟。我做错了什么?
由于
答案 0 :(得分:3)
我将猜测最初问题中遗漏的一些事情。
1)澄清一下,问题是:滑块的移动不平滑。 2)此外,作为这种UI粗糙度的结果或与之结合,图像的变化会有延迟。
我不确定你的实现是什么样的,但是,听起来你在主线程上做了太多的工作和/或太多了。
所以,这是一个正常运作的实现可能会做什么:
- (void)sliderChanged:(UISlider *)sender
{
[self adjustImageBrightnessWithValue:sender.value;
}
- (void)adjustImageBrightnessWithValue:(CGFloat)value
{
[self cancelCurrentWork]; // Maintain a reference to an operation and cancel it
[self adjustImageBrightnessAsyncWithValue:(CGFloat)value originalImage:self.imageView.image completion:^(UIImage *finalImage)
{
self.imageView.image = finalImage;
}
}
adjustImageBrightnessAsyncWithValue采用值,原始图像和完成块。它创建一个操作(通过NSOperation或NSOperationQueue,可能两者)并跟踪该操作。该操作将算法应用于背景中的原始图像。完成后,完成块将在主线程的图像视图中设置最终图像。
主线程上发生的唯一事情是:获取滑块更改回调,取消以前的工作,开始新工作以及设置最终图像。其他一切都应该在后台发生。取消工作是针对用户在值再次变化之前移动滑块太快而无法修改图像的情况的优化。一旦滑块的变化不足以进行修改,结果将是可见的。滑块应始终是平滑的,因为没有任何东西挡住主线程。
修改
使用操作队列...... 声明成员变量:
NSOperationQueue *m_queue;
...
在init方法中初始化它:
m_queue = [NSOperationQueue new];
m_queue.maxConcurrentOperationCount = 1; // So it only does one brightness calculation at a time and there are no concurrency issues.
...
- (void)adjustImageBrightnessWithValue:(CGFloat)value
{
[m_queue cancelAllOperations];
[m_queue addOperationWithBlock:^
{
UIImage *adjustedImage = [mainimage brightness:value]; // Not sure where this method is coming from, but this code assumes it returns a copy of mainimage with the brightness adjusted.
dispatch_async(dispatch_get_main_queue(), ^
{
imageview.image = adjustedImage;
});
}];
}
另外,另外,您可以看一下GPUImage,这里讨论:http://nshipster.com/gpuimage/,用于快速,强大的图像修改技术/ API。
答案 1 :(得分:1)
使用
slider.isContinuous = false
这将解决问题。