【问题标题】:can't draw fast enough to keep up with touchesMoved?无法快速绘制以跟上 touchesMoved?
【发布时间】:2009-03-05 16:19:10
【问题描述】:

我正在尝试在我的 iPhone 应用中实现简单的绘画功能。我尝试使用位图画笔更新位图,还尝试了this tutorial

这两种方法都有同样的问题,尽管代码几乎完全不同。它只发生在设备上 - 模拟器工作正常。

当我触摸屏幕并移动手指时,屏幕不会更新。当我暂停或抬起手指时,屏幕就会更新。这不是一个很好的用户体验!

我尝试直接从 touchesMoved 调用 drawRect,但发现绘图上下文(我使用 UIGraphicsGetCurrentContext 检索)对于许多调用都是无效的,因此为每个 touchesMoved 自己绘制屏幕不起作用。

有什么想法吗?

感谢您的帮助,这非常令人沮丧!

亨宁

【问题讨论】:

    标签: iphone


    【解决方案1】:

    在我看来,您并没有给主运行循环更新显示的机会。您的绘图代码的执行时间可能比触摸事件之间的时间长,因此显示永远不会更新。当您抬起手指时,它会进行更新,因为它不再为您的绘图带来负担。

    您可能会考虑优化绘图以加快绘图速度(例如,仅在屏幕的脏区域内绘图),使用 NSOperationQueue 之类的东西将绘图的繁重计算排队以在后台线程上运行,或者有选择地删除触摸绘图事件以保持您的响应流畅。

    另一种可能性是将繁重的绘图代码放在单独的方法中,并通过 performSelector:withObject:afterDelay 调用它,延迟为 10 毫秒(或更短)。这可能使主运行循环有机会使用其当前状态更新显示。我没有对此进行测试,但如果我没记错的话,我已经看到了这项工作。

    【讨论】:

    • 我会试一试,看看效果如何。谢谢。
    【解决方案2】:

    你不能直接调用drawRect:。要按需刷新屏幕,请尝试从 touchesMoved 方法调用 [self setNeedsDisplay],这将为调用 drawRect: 设置适当的上下文。

    【讨论】:

    • 谢谢,但我尝试从 touchesMoved 执行 [self setNeedsDisplay]。它没有帮助。
    猜你喜欢
    • 2012-10-17
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多