iOS 7中UISlider/触摸事件的更改

4
我在iOS 7上遇到了一个问题,我认为它与事件处理有关。 我有一个滑块,当它的值改变时会进行一些图像处理,大约需要100毫秒的时间完成。在iOS 6中,我可以看到随着滑块的拖动图像的变化。升级到iOS 7后,似乎视图在值更改事件的调用之间没有重新绘制。在拖动滑块时,我可以看到图像处理多次启动和完成,但整个视图(包括滑块的拇指)直到我停止滑动才会刷新。当我在视图中添加手势处理程序执行相同操作时,情况也相同。是否有人遇到过类似的问题? 谢谢。

1
如果你能提供一些代码,这将会大有帮助。我“认为”我理解你的意思,但任何额外的信息都是有帮助的,例如代码、问题的图片等其他内容,而不仅仅是一段长长的文字描述。 - Joel Fischer
你尝试过手动调用 setNeedsDisplay 吗? - Guy Kogus
是的,我已经尝试调用setNeedsDisplay,但没有任何变化。 - idan
1个回答

0

确保您不要在主线程上执行该处理。我建议使用GCD将处理调度到单独的队列上-它只需要很少的代码并使用已经成熟的模式,易于理解。


我想过将处理工作放在后台线程中进行,但这会要求我需要进行更多的工作,因为我需要处理按顺序而不是同时执行(除非您可以指向像工作队列之类的东西,它可以在后台但按顺序执行操作)。此外,它在iOS 6上表现完美,并且图像处理时间不会太长,但如果其他方法都失败了,我可能会选择这种方式。 - idan
@idan 你可以使用GCD串行队列来实现。 - Aaron Brager
苹果公司强烈建议将任何处理工作放在与UI不同的队列中进行。实现它的工作量非常低,而回报却相当高。如果任务是简单的“先做A,然后做B,最后做C”类型,您可以使用串行队列;如果任务之间存在依赖关系,NSOperationQueue使得实现这一点变得轻而易举。 - RyanR
添加串行队列后,情况有所改善,但仍不如iOS 6那样好。我最终做的是添加一个串行队列,每次滑块变化时都会添加一个工作项并删除所有先前的工作项。因此,基本上在当前项开始之前,您最多只需要等待一个项目完成。仍然存在的主要问题是我有一个手势处理程序,它会影响图像掩码,因为用户绘制。显然,我无法取消先前的工作项,这会导致绘制和实际在屏幕上看到效果之间存在延迟。 - idan
如果需要取消先前的工作项,请使用NSOperationQueue。然后,您的工作块需要频繁检查它们是否应该被取消。如果您在问题中提供了有关图像处理类型的更多信息,我们可能会更有帮助。 - RyanR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接