2012-04-13 5 views
4

Ich habe diesen Code in Hinblick auf Farbe:IOS: zeichnet ein Bild in einer Ansicht

UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:drawImage]; 

    UIGraphicsBeginImageContext(drawImage.frame.size); 
    [drawImage.image drawInRect:CGRectMake(0, 0, drawImage.frame.size.width, drawImage.frame.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), size); 

     CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), r, g, b, a); 

    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

mein Problem ist, dass ich nicht mit einem Punkt färben will, aber ich mag ein bestimmtes Bild verwenden, die wird wiederholt (als PNG-Bild) Ist es möglich?

+0

self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @ "image.png"]]; – Hanuman

+0

können Sie bitte erklären? – CrazyDev

Antwort

8

Es ist einfach, ein einzelnes UIImage zu laden und zieht es:

UIImage *brushImage = [UIImage imageNamed:@"brush.png"]; 
[brushImage drawAtPoint:CGPointMake(currentPoint.x-brushImage.size.width/2, currentPoint.y-brushImage.size.height/2)]; 

Dadurch wird das Bild zeichnet nur einmal pro Zyklus, nicht eine durchgehende Linie. Wenn Sie die vollen Linien Ihres Pinselbildes wünschen, lesen Sie Objective C: Using UIImage for Stroking.

Dies könnte dazu führen, dass jedes Mal, wenn diese Methode aufgerufen wird, die Imagedatei geladen wird. Während die Ergebnisse von [UIImage imageNamed:] oft zwischengespeichert werden, könnte mein Code oben verbessert werden, indem der Pinsel für die spätere Wiederverwendung gespeichert wird.

Apropos Leistung, testen Sie dies auf älteren Geräten. Wie geschrieben, funktionierte es auf meinem iPod touch der zweiten Generation, aber jede Hinzufügung könnte es auf Geräten der zweiten und dritten Generation stottern lassen. Apples GLPaint Beispiel, von @Armaan empfohlen, verwendet OpenGL für schnelles Zeichnen, aber viel mehr Code ist beteiligt.

Auch scheinen Sie Ihre Interaktion zu tun (touchesBegan:, touchesMoved:, touchesEnded:) in einer Ansicht, die dann ihren Inhalt drawImage zieht, vermutlich ein UIImageView. Es ist möglich, das Malbild zu speichern und dann den Ebeneninhalt dieser Ansicht auf dieses Bild zu setzen. Dies wird die Leistung nicht beeinträchtigen, aber der Code wird sauberer sein. Wenn Sie fortfahren, drawImage zu verwenden, greifen Sie auf es über eine property stattdessen mit seinem ivar zu.

+2

+ 1.Nice Erklärung. – Iducool

Verwandte Themen