【问题标题】:forcing setNeedsDisplay强制设置NeedsDisplay
【发布时间】:2013-01-06 23:33:03
【问题描述】:

我有一个使用 CoreGraphics 和 drawRect 绘制齿轮的例程。我使用一个按钮来推进各个阶段的齿轮:

-(IBAction)advanceButtonPressed:(id)sender{

stage=stage+1;

if (stage==4) stage=0;

[self setNeedsDisplay];

}

绘制齿轮的例程在drawRect中,根据stage的vale将轮齿绘制到新的位置,传给drawRect。分四步,每按一次按钮,齿轮就会转到新的位置(绕圆一圈)。

我更改了 buttonPressed 例程,让它循环执行四个阶段,所以我只需要按一次按钮,但它不起作用:

-(IBAction)buttonPressed:(id)sender{

for (stage=0;stage<4;stage++){

    NSLog(@"%i",stage);

[self setNeedsDisplay];
}

}

我的 NSLog 显示该阶段经历了它的四个值,就像在前面的例程中一样。但是 setNeedsDisplay 只执行一次,(正如 drawRect 中的 NSLog 跟踪所证实的那样),因此齿轮显示在其最终位置,而不是中间阶段。看起来 setNeedsDisplay 仅在按钮例程完成时执行,尽管它位于循环内。

有没有办法强制执行?

【问题讨论】:

    标签: ios cocoa-touch uikit setneedsdisplay


    【解决方案1】:

    无论您拨打setNeedsDisplay 的频率如何,iPhone 每秒只会更新 60 次屏幕。您的循环将在不到 1/60 秒的时间内执行。这就是为什么您只会看到最后一个状态。

    如果您想通过一个按钮来显示所有四种状态,那么您可以使用计时器或performSelector: afterDelay 来显示所有四种状态。稍微复杂一点,但你去吧。

    【讨论】:

    • 与屏幕刷新率无关;直到方法返回后它才会真正显示的原因是因为这就是 Cocoa 和 Cocoa Touch 中的绘图工作方式。循环需要多长时间并不重要。即使您花一分钟时间,在您的代码将控制权返回给运行循环之前,仍然不会进行绘图。 developer.apple.com/library/ios/documentation/WindowsViews/…
    【解决方案2】:

    调用 setNeedsDisplay 只是标记要在下一个绘图周期重绘的视图。

    要在您的方法中重绘它,您可以显式调用 drawRect:

    【讨论】:

    • 您不应显式调用drawRect:The documentation 建议不要这样做,即使允许,在这种情况下这样做只会浪费用户的电池时间。正确的解决方案是 skinnyTOD 建议的:使用一个计时器来依次显示每个状态,有足够的时间间隔让系统有机会调用 drawRect: 并让用户看到变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多