2011-01-14 6 views
2

Ich versuche, herauszufinden, wie man eine Menge dynamicly gezogenen Linien in Quartz 2D flach oder zusammenführen kann,„Flatten“ oder „Merge“ Quartz 2D gezogenen Linien

ich zufällige Linien im Laufe der Zeit bin Zeichnung auf meinem Bühne, ich füge neue Zeilenkoordinaten jedes Mal zu einem Array und zeichne das Array (mit meinem DrawRect und ich schiebe eine neue Zeile in meinem Array mit einem Timer und einem SetNeedDisplay, um alle vorherigen Zeilen plus die neue neu zu zeichnen)

jetzt das PROBLEM: nach einer Weile wird es langsam und langsam zu bekommen, weil die Arrays sehr lang werden, also ich sollte ich die Koordinaten in ein flaches Bild oder etwas zusammenführen und die Arrays zu k löschen eep es Gedächtnis gesund, aber wie mache ich das?

Dies ist mein aktueller Workflow:

  • Anruftimer

    [NSTimer scheduledTimerWithTimeInterval: 0,1 Ziel: Selbstwähler: @selector (drawdrawdraw) userinfo: null Wiederholungen: YES];

  • Aktualisieren Sie die drawRect in meiner "drawdrawdraw" -Funktion

    - (void) {drawdrawdraw [self setNeedsDisplay]; }

  • mein drawRect

    -(void)drawRect:(CGRect)rect{ 
        viewContext = UIGraphicsGetCurrentContext(); 
    
        int count = [mijnArray_r_x count]; 
    
        float r_x = (float)(random() % 768); 
        [mijnArray_r_x insertObject:[NSNumber numberWithFloat:r_x] atIndex:count]; 
    
        float r_y = (float)(random() % 1004); 
        [mijnArray_r_y insertObject:[NSNumber numberWithFloat:r_y] atIndex:count]; 
    
        float r_w = (float)(random() % 100); 
        [mijnArray_r_w insertObject:[NSNumber numberWithFloat:r_w] atIndex:count]; 
    
        float r_a = (float)(random() % 100); 
        [mijnArray_r_a insertObject:[NSNumber numberWithFloat:r_a] atIndex:count]; 
    
    
        CGContextSetLineWidth(viewContext, 2.0); 
        CGContextSetStrokeColorWithColor(viewContext, [UIColor blackColor].CGColor); 
        for (int k = 0; k <= count; k++) { 
    
         float temp_x = [[mijnArray_r_x objectAtIndex: k] floatValue]; 
         float temp_y = [[mijnArray_r_y objectAtIndex: k] floatValue]; 
         float temp_w = [[mijnArray_r_w objectAtIndex: k] floatValue]; 
         float temp_a = [[mijnArray_r_a objectAtIndex: k] floatValue]; 
    
         CGPoint pointpointpoint = CGPointMake(temp_x, temp_y); 
         CGPoint pointpointpointpoint = CGPointMake(temp_w, temp_a); 
         CGContextMoveToPoint(viewContext, pointpointpoint.x, pointpointpoint.y); 
         CGContextAddLineToPoint(viewContext, pointpointpoint.x - pointpointpointpoint.x, pointpointpoint.y + pointpointpointpoint.y); 
         CGContextStrokePath(viewContext); 
        } 
    } } 
    

Antwort

0

Sie Ihre Zeilen in eine UIImageUIGraphicsBeginImageContext() unter Verwendung ziehen. Auf diese Weise wird die zum Zeichnen benötigte Zeit konstant sein, da Sie in jeder Iteration nur das zwischengespeicherte Bild als Bitmap und die neuen Linien, die Sie hinzufügen, zeichnen.

- (void)drawRect:(CGRect)rect { 
    [self.currentImage drawInRect:[self bounds]]; 
    UIGraphicsBeginImageContext([self bounds].size); 
    CGContextRef cgContext = UIGraphicsGetCurrentContext(); 
    //Draw your lines into the cgContext here... 
    self.currentImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

Dies setzt voraus, dass Sie die Eigenschaft currentImage vom Typ UIImage erklärt haben.

+0

funktioniert! Vielen Dank! : D – RecycleRobot