首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setNeedsDisplayInRect (quartz2d、iPhone)出现问题

setNeedsDisplayInRect (quartz2d、iPhone)出现问题
EN

Stack Overflow用户
提问于 2010-01-17 07:56:55
回答 1查看 1.1K关注 0票数 0

我已经写了一个函数,它每2秒在一个随机位置绘制x个正方形。一个正方形不能在同一位置绘制两次。一旦应用程序完成了一个周期,网格就会被填充。现在,当绘制的正方形数量为<=8时,该方法效果很好,但是当该值较高时,会将一个正方形随机绘制到与前一个正方形相同的位置。

我没有在任意位置画一个正方形,而是尝试从上到下绘制它们,这种方法效果很好。

我已经调试了几天了,我相信问题出在setNeedsDisplayInRect。

希望有人能帮上忙。如果我漫无边际,很抱歉,现在已经很晚了,我的头都碎了,哈哈:)

下面是代码..。

代码语言:javascript
复制
- (void)drawRect:(CGRect)rect {
int count = [writeSquares count];

CGContextRef context = UIGraphicsGetCurrentContext();

int radius = 4;

for (int i = 0; i <count; i++)
{
    Square *square = [writeSquares objectAtIndex: i];

    CGContextSetLineWidth(context, 1);
    //CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetFillColorWithColor(context, [square color].CGColor);
    CGContextMoveToPoint(context, CGRectGetMinX([square squareRect]) + radius, CGRectGetMinY([square squareRect]));
    CGContextAddArc(context, CGRectGetMaxX([square squareRect]) - radius, CGRectGetMinY([square squareRect]) + radius, radius, 3 * M_PI / 2, 0, 0);
    CGContextAddArc(context, CGRectGetMaxX([square squareRect]) - radius, CGRectGetMaxY([square squareRect]) - radius, radius, 0, M_PI / 2, 0);
    CGContextAddArc(context, CGRectGetMinX([square squareRect]) + radius, CGRectGetMaxY([square squareRect]) - radius, radius, M_PI / 2, M_PI, 0);
    CGContextAddArc(context, CGRectGetMinX([square squareRect]) + radius, CGRectGetMinY([square squareRect]) + radius, radius, M_PI, 3 * M_PI / 2, 0);  
    CGContextClosePath(context);
    CGContextFillPath(context);

    //NSLog(@"x = %f x = %f", CGRectGetMaxX([square squareRect]), CGRectGetMinX([square squareRect]));
}

//NSLog(@"Count %i", [writeSquares count]);

[writeSquares removeAllObjects];

}

代码语言:javascript
复制
-(void)drawInitializer:(int) counter{

if(extra != 0) {
    [self setNeedsDisplay];
    [grid removeAllObjects];
    [self calculateGrid];
    counter = counter + extra;
    clear = YES;
    extra = 0;
}

for(int i=0; i<counter; i++) {
    int count = [grid count];
    NSLog(@"counter %i", count);
    if(count != 144) {
        srandom(time(NULL));
        int r = random() % [coordinates count];

        Coordinate *coordinate = [coordinates objectAtIndex:r];


        Square *square = [Square new];
        [square setSquareRect: CGRectMake ([coordinate x] * 25, [coordinate y] * 25, 20, 20)];
        [square setColor: [UIColor randomColor]];
        [writeSquares addObject:square];
        [grid addObject:square];
        [square release];

        [self setNeedsDisplayInRect:CGRectMake ([coordinate x] * 25, [coordinate y] * 25, 20, 20)];

        [coordinates removeObjectAtIndex:r];
        [coordinate release];
    }
    else {
        extra++;
    }
}

//[newlock release];

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-17 09:00:55

我不知道为什么会这样;在我看来,你所有的-setNeedsDisplayInRect:调用都会被合并到一个更新中。我猜你会喜欢每个方块的外观,一个接一个的“弹出”?

如果是这种情况,您需要给操作系统时间来循环它的事件循环(这些调用只会在当前事件循环之后强制屏幕更新)。

您应该将循环移动到一个单独的方法中,并使用-performSelector:withObject:afterDelay:或NSTimer调用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2079438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档