在我的代码中,我希望“动画”绘制一条线的延迟,所以在向视图中添加一个新行后,我调用setNeedsDisplay - 它工作正常一次。
在drawRect方法中,我绘制线并调用线的方法来增加line-lengthl。现在我想再次调用setNeedsDisplay来重绘这一行 - 所以它是一个“成长”的动画..
但它只调用setNeedsDisplay一次&再也不会,除了我添加另一行。 我也尝试在这个类中调用一个方法,调用setNeedsDisplay,以确保你不能在drawRect中调用它。
- (void)drawRect:(CGRect)rect {
for(GameLine *line in _lines) {
if(line.done) {
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(c, 5.0f);
CGContextSetStrokeColor(c, lineColor);
CGContextBeginPath(c);
CGContextMoveToPoint(c, line.startPos.x, line.startPos.y);
CGContextAddLineToPoint(c, line.endPos.x, line.endPos.y);
CGContextStrokePath(c);
}else {
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(c, 5.0f);
CGContextSetStrokeColor(c, delayColor);
CGContextBeginPath(c);
CGContextMoveToPoint(c, line.delayStartPos.x, line.delayStartPos.y);
CGContextAddLineToPoint(c, line.delayEndPos.x, line.delayEndPos.y);
CGContextStrokePath(c);
[line incrementDelayLine];
[self setNeedsDisplay];
}
}
}
_lines 是带有GameLine对象(非原子,保留)属性的NSMutableArray。
答案 0 :(得分:5)
预期。
调用setNeedsDisplay时,将视图标记为需要重绘。好。系统得到它。
它将在您的应用程序的主循环下次运行时完成。
如果您确实要刷新视图现在,请致电:
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];
在setNeedsDisplay
之后。
确实,apple documentation州(强调我的):
当视图的实际内容发生变化时,它就是您的 责任通知系统您的视图需要 重绘。您可以通过调用视图的 setNeedsDisplay 或来执行此操作 setNeedsDisplayInRect:视图的方法。 这些方法让 系统知道它应该在下一次绘图期间更新视图 循环。因为等待下一个绘图周期来更新 在view中,您可以在多个视图上调用这些方法来更新它们 同时。
另外,请参阅以下SO问题:
答案 1 :(得分:1)
如果您需要动画 - 启动计时器,一旦它被触发 - 调整您想要的任何行参数并调用setNeedsDisplay