Проблема с setNeedsDisplayInRect (quartz2d, ​​iPhone) - PullRequest
0 голосов
/ 17 января 2010

Я написал функцию, которая рисует х число квадратов в случайной позиции каждые 2 секунды. Квадрат нельзя нарисовать в одной и той же позиции дважды. После того, как приложение завершит цикл, сетка будет заполнена. Теперь это работает нормально, когда число нарисованных квадратов <= 8, однако, когда оно выше, квадрат случайным образом вытягивается в ту же позицию, что и предыдущий квадрат. </p>

Вместо того, чтобы рисовать квадрат в случайной позиции, я попытался нарисовать их сверху вниз, и это прекрасно работает.

Я отлаживал это в течение нескольких дней, и я считаю, что проблема заключается в setNeedsDisplayInRect.

Надеюсь, кто-нибудь может помочь. Извините, если я бродил, уже поздно, и моя голова разбита, смеется :) 1007 *

Ниже приведен код ....

- (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];

}

-(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];

}

1 Ответ

0 голосов
/ 17 января 2010

Я не уверен, почему это сработало; мне кажется, что все ваши -setNeedsDisplayInRect: вызовы будут объединены в одно обновление. Полагаю, вы хотите, чтобы каждый квадрат появлялся один за другим?

Если это так, вам нужно дать ОС время на цикл обработки своего цикла событий (эти вызовы вызовут обновление экрана только после текущего цикла событий.)

Вы должны переместить свой цикл в отдельный метод и вызвать его с помощью -performSelector: withObject: afterDelay: или NSTimer.

...