Domanda

Ho scritto una funzione che attira x numero di quadrati in una posizione casuale ogni 2 secondi. Un quadrato non può essere disegnato nella stessa posizione due volte. Una volta che l'applicazione ha completato un ciclo la griglia viene compilato. Ora, questo funziona bene quando il numero di quadrati disegnati è <= 8, tuttavia quando questo è più alto un quadrato è disegnato in modo casuale nella stessa posizione come un quadrato precedente.

Invece di disegnare un quadrato in una posizione casuale Ho provato li attingendo alto-basso e questo funziona perfettamente.

Sono stato debug di questo per un paio di giorni e credo che il problema si trova con setNeedsDisplayInRect.

La speranza che qualcuno possa aiutare. Scusate se ho divagato, il suo facendo tardi e la mia testa è purè, lol:)

Di seguito è riportato il codice ....

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

}

È stato utile?

Soluzione

Io non sono sicuro perché questo mai lavorato; mi sembra che tutti i vostri -setNeedsDisplayInRect: le chiamate saranno fusero in un unico aggiornamento. Sto indovinando vuoi l'aspetto di ogni quadrato 'popping' in, uno dopo l'altro?

Se questo è il caso, è necessario dare il sistema operativo tempo di ciclo il suo ciclo di eventi (queste chiamate saranno vigore solo un aggiornamento dello schermo dopo il ciclo di evento corrente.)

Si dovrebbe spostare il ciclo in un metodo separato, e chiamarlo sia con un -performSelector: withObject: afterDelay :, o un NSTimer

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top