4 Stimmen

IOS: Ein Bild in einer Ansicht zeichnen

Ich habe diesen Code zum Einfärben 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 möchte, sondern ich möchte ein bestimmtes Bild verwenden, das wiederholt wird (als png-Bild) Ist das möglich?

8voto

Cowirrie Punkte 7158

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

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 nur einmal pro Zyklus gezeichnet, nicht als durchgehende Linie. Wenn Sie durchgehende Linien für Ihr Pinselbild wünschen, siehe Objective C: Verwendung von UIImage für Stroking .

Dies könnte dazu führen, dass die Bilddatei bei jedem Aufruf dieser Methode geladen wird, was sie langsam macht. Während die Ergebnisse von [UIImage imageNamed:] häufig zwischengespeichert werden, könnte mein obiger Code verbessert werden, indem der Pinsel zur späteren Wiederverwendung gespeichert wird.

Apropos Leistung: Testen Sie dies auf älteren Geräten. So wie es geschrieben ist, funktionierte es auf meinem iPod touch der zweiten Generation, aber alle Ergänzungen könnten es auf Geräten der zweiten und dritten Generation zum Stottern bringen. Apples GLPaint Beispiel, das von @Armaan empfohlen wurde, verwendet OpenGL für schnelles Zeichnen, ist aber mit viel mehr Code verbunden.

Außerdem scheinen Sie Ihre Interaktion zu pflegen ( touchesBegan: , touchesMoved: , touchesEnded: ) in einer Ansicht, die dann ihren Inhalt in drawImage , vermutlich ein UIImageView . Es ist möglich, das Bild zu speichern und dann den Inhalt der Ebene dieser Ansicht auf dieses Bild festzulegen. Dies wird die Leistung nicht verändern, aber der Code wird sauberer sein. Wenn Sie weiterhin drawImage zugreifen, und zwar über eine property stattdessen mit seinem Ivar.

2voto

Iducool Punkte 3323

Sie können mit dem Beispielcode von APPLE beginnen: Beispielcode:GLPaint

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X