01.05.2012

Xcode 4, iPhone, Cocoa Touch, iOS4, iOS5

Tutorial: Custom View (Sierpinski-Dreieck zeichnen)

In diesem Tutorial wird erklärt, wie man eine iPhone-App mit einer Custom-View erstellt. Die App wird mittels der Methode drawRect das Sierpinski-Dreieck direkt in die Custom-View zeichnen. Zum Zeichnen der Linien und zum Ausfüllen der Flächen wird CoreGraphics verwendet. Die fertige App sieht folgendermaßen aus:

Weitere Informationen zum Sierpinski-Dreieck findet man hier.

Gestartet wird mit dem Anlegen einer iPhone App (⌘+⇧+N).

Create New Project

Da die fertige App nur eine einzige View verwendet, wird als Projekt-Template Single View Application ausgewählt.

Create New Project

Als Product Name für die App verwenden wir SierpinskiApp.

Create New Project

Zum Anlegen des Projekts muß der Button Create angeklickt werden. Anschließend sollte Xcode sich öffnen und folgendes zu sehen sein.

Create New Project

Nun wird als erstes eine neues Objective-C Klasse mit ⌘+N angelegt.

Create New Project

Als Klassenname Class wird SierpinskiView gewählt. Diese Klasse soll eine Subclass of UIView sein.

Create New Project

Der letzte Dialog kann einfach mit Create bestätigt werden.

Create New Project

Daraufhin werden die Dateien SierpinskiView.h und SierpinskiView.m angelegt.

Create New Project

In der Datei SierpinskiView.m wird nun als erstes die Methode - (void)sierpinski:(CGPoint)A:(CGPoint)B:(CGPoint)C:(int)d:(CGContextRef)context hinzugefügt. Sie sorgt dafür, daß das Sierpinski-Dreieck in der CGContextRef gezeichnet wird. Dabei wird im oberen Teil der Methode jeweils die Mitte der Kanten bestimmt und diese Werte zum erneuten Aufruf der Methode benutzt (Rekursion). Im else-Zweig der Methode findet das Zeichnen des Dreiecks statt.

- (void)sierpinski:(CGPoint)A:(CGPoint)B:(CGPoint)C:(int)d:(CGContextRef)context {
    if(d>0) {
        CGPoint mA = CGPointMake((B.x + C.x) / 2, (B.y + C.y) / 2);
        CGPoint mB = CGPointMake((A.x + C.x) / 2, (A.y + C.y) / 2);
        CGPoint mC = CGPointMake((A.x + B.x) / 2, (A.y + B.y) / 2);
        
        d--;
        
        [self sierpinski:A :mB :mC :d :context];
        [self sierpinski:mC :mA :B :d :context];
        [self sierpinski:mB :mA :C :d :context];
        
    }
    else {
        CGContextBeginPath(context);
        CGContextMoveToPoint(context, A.x, A.y);
        CGContextAddLineToPoint(context, B.x, B.y);
        CGContextAddLineToPoint(context, C.x, C.y);
        CGContextClosePath(context);
        
        [[UIColor greenColor] setFill];
        [[UIColor blackColor] setStroke];
        CGContextDrawPath(context, kCGPathFillStroke);
    }
}

Als zweites wird die Methode drawRect:(CGRect) erweitert. Es wird der CGContextRef bestimmt, in den gezeichnet werden soll. In der Variable d wird eine Rekusionstiefe für das Sierpinski-Dreieck festgelegt und danach werden die Eckpunkte des äußeren Dreiecks festgelegt. In dem Beispiel werden die Koordinaten der Eckpunkte ausgehend vom Mittelpunkt des iPhone-Displays berechnet. Weitere Informationen zum Sierpinski-Dreick findet man hier.

Beim Zeichnen auf dem iPhone ist zu beachten, daß sich der Punkt (0,0) links oben in der Ecke befindet. Auf dem Mac ist der Ursprung links unten.

#define SIZE 320.0

- (void)drawRect:(CGRect)rect
{    
    // Mittelpunkt bestimmen
    CGPoint midPoint;
    midPoint.x = self.bounds.origin.x + self.bounds.size.width/2;
    midPoint.y = self.bounds.origin.y + self.bounds.size.height/2;
    
    CGContextRef c = UIGraphicsGetCurrentContext();
    int d = 5; // Rekursionstiefe

    //float height = (SIZE/2) * sqrt(3); //Hoehe
    float ri = (SIZE/6) * sqrt(3); // Innenradius
    float ru = (SIZE/3) * sqrt(3); // Aussenradius

    CGPoint A = CGPointMake(midPoint.x-(SIZE/2), midPoint.y+ri);
    CGPoint B = CGPointMake(midPoint.x+(SIZE/2),  midPoint.y+ri);
    CGPoint C = CGPointMake(midPoint.x,(midPoint.y - ru));  
    
    [self sierpinski:A:B:C:d:c];
}

Wie sich die Punkte A, B, C und die Werte ri und ru berechnen, kann man gut in der folgenden Abbildung erkennen. (Wobei in der Abbildung mit der Kantenlänge von a=500 und nicht mit a=320 gearbeitet wurde.

Create New Project

Als nächste wird das Storyboard selektiert und in der Object Library nach UIView gesucht, um diese anschließend in das Storyboard zu ziehen.

Create New Project

Abschließend wird im Identity Inspector als Class der Name der View SierpinskiView eingetragen.

Create New Project

Nach dem Kompilieren und Starten mit ⌘+R öffnet sich der Simulator und zeigt das Sierpinski-Dreieck in der CustomView.

Eine weitere Möglichkeit neue Views anzulegen, ist ein leeres XIB zu erzeugen und dieses über einen View-Controller anzusprechen. Wie das funktioniert wird in dem Artikel Tutorial: UITabBarController erklärt.