iPhone:drawRect 调用一次
Posted
技术标签:
【中文标题】iPhone:drawRect 调用一次【英文标题】:iPhone: drawRect called once 【发布时间】:2010-01-07 18:08:30 【问题描述】:我每两秒从 NSTimer 函数调用 setNeedsDisplayInRect。这完美地工作,并在随机位置绘制一个正方形,具有随机颜色。但是,在某些情况下,我想在 NSTimer 函数中绘制平方 x 次(使用 for 循环) - 但是,经过多次错误测试后,即使我正在运行 setNeedsDisplayInRect x number of次?我希望得到一些帮助,因为我整天都在试图解决这个问题。卡尔。
编辑下面是我的代码...
查看
- (void)drawRect:(CGRect)rect
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
CGContextSetFillColorWithColor(context, currentColor.CGColor);
CGContextAddRect(context, redrawRect);
CGContextDrawPath(context, kCGPathFillStroke);
-(void)drawInitializer
int x = (int)arc4random() % [self.xCoordinates count];
int y = (int)arc4random() % [self.yCoordinates count];
self.currentColor = [UIColor randomColor];
self.redrawRect = CGRectMake ([[self.xCoordinates objectAtIndex:x] intValue], [[self.yCoordinates objectAtIndex:y] intValue], 25, 25);
[self setNeedsDisplayInRect:redrawRect];
控制器
- (void) handleTimer: (NSTimer *) timer
for(int i=0; i<5; i++)
[self.squareView drawInitializer];
【问题讨论】:
-setNeedsDisplay:
仅将视图标记为需要重新显示;在下一次通过运行循环之前,它实际上并没有被重绘。
Wevah 是正确的。您在紧密循环中调用 -setNeedsDisplayInRect: 五次,但在您到达运行循环结束之前不会发生重绘。
【参考方案1】:
您可以重构代码,以便拥有一个简单的类:
存储颜色 存储位置 有一种方法可以生成随机位置、颜色、...然后,您可以创建任意数量的实例并将它们推送到 NSMutableArray
。
这样您就可以遍历该列表,并在您的绘图例程中绘制每个对象。
每当您添加/删除/修改您的一个对象时,请致电setNeedsDisplay:
【讨论】:
【参考方案2】:您可以创建一个能够自行绘制的类,然后根据需要创建该类的尽可能多的实例。
【讨论】:
以上是关于iPhone:drawRect 调用一次的主要内容,如果未能解决你的问题,请参考以下文章
在 iPhone 和 iPad 上,我们可以在不使用 drawRect 的情况下绘制任何东西吗?
当我覆盖“drawRect”时,UIButton 样式设置被忽略
在 iOS 和 iPhone 上,如何绘制位图并在 drawRect 中显示?