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 调用一次的主要内容,如果未能解决你的问题,请参考以下文章

跨多个 UIView 子类的单个 drawRect 实现

在 iPhone 和 iPad 上,我们可以在不使用 drawRect 的情况下绘制任何东西吗?

当我覆盖“drawRect”时,UIButton 样式设置被忽略

在 iOS 和 iPhone 上,如何绘制位图并在 drawRect 中显示?

NSString 到 C 风格的 char 数组在第二次调用 drawRect 时崩溃

如果我经常调用 setneedsdisplay,drawrect 多久会被调用一次?这是为啥?