2008-12-09 14 views
14

Kann mir jemand in der richtigen Weise, um eine farbige Blase/Kreis programmgesteuert zu erstellen?Erstellen Sie eine farbige Blase/Kreis programmgesteuert in ObjectiveC und Cocoa

Ich kann Bilder nicht so verwenden, wie ich es brauche, um eine Farbe abhängig von Benutzerinteraktion zu sein.

Mein Gedanke war vielleicht, ein weißes Kreisbild zu machen und dann eine Farbe darüber zu überlagern. Ich bin mir jedoch nicht sicher, ob das funktionieren würde oder wie man das wirklich machen könnte.

Wenn mir jemand die richtige Richtung zeigen könnte, würde ich es begrüßen.

Antwort

11

Erstellen Sie eine NSView-Unterklasse, die einen NSColor als einen ivar enthält. Erstellen Sie in der drawRect-Methode einen NSBezierPath der entsprechenden Größe, indem Sie die Grenzen der Ansicht verwenden. Stellen Sie dann die Farbe [myColor set] ein und füllen Sie den Pfad [myPath fill]. Es gibt noch viel mehr, was Sie tun können, wie z. B. Transparenz, Rahmen und so weiter, aber ich überlasse das den Dokumenten, es sei denn, Sie haben eine bestimmte Frage.

Um die NSView-Unterklasse zu verwenden, ziehen Sie einfach ein Ansichtsobjekt auf Ihre Spitze und wählen Sie den Namen Ihrer Unterklasse in der benutzerdefinierten Klasse im IB-Inspektor. Sie müssen auch eine Steckdose in Ihrem Controller einrichten, damit Sie die Farbe nach Bedarf ändern können.

+0

Sieht aus wie es gerade ist a: bezierPathWithOvalInRect: Danke! – kdbdallas

+0

Yup, das ist neu in Leopard, wenn ich mich richtig erinnere. Davor war es eines der allerersten Dinge, die neue Cocoa-Programmierer (einschließlich mir selbst) zu tun hatten, eine Kategorie in NSBezierPath zu definieren, um einen kreisförmigen oder abgerundeten Rechteckpfad zu erstellen. :) –

31

Es gibt ein paar Schritte, um etwas in Cocoa zu zeichnen.

Zuerst benötigen Sie einen Pfad, der zum Definieren des Objekts verwendet wird, das Sie zeichnen möchten. Sehen Sie hier Drawing Fundamental Shapes für eine Anleitung zum Erstellen von Pfaden in Cocoa. Sie werden am meisten daran interessiert sein, die Nachricht "appendBezierPathWithOvalInRect" an ein "NSBezierPath" -Objekt zu senden. Dabei wird ein Rechteck verwendet, das den zu zeichnenden Kreis begrenzt.

Dieser Code wird ein 10x10 Kreis erstellen bei 10,10 Koordinaten:

NSRect rect = NSMakeRect(10, 10, 10, 10); 
NSBezierPath* circlePath = [NSBezierPath bezierPath]; 
[circlePath appendBezierPathWithOvalInRect: rect]; 

Sobald Sie Ihren Weg haben Sie die Farbe für die aktuelle Zeichnung Kontext setzen. Es gibt zwei Farben, Strich und Füllung; Strich ist der Umriss des Pfades und die Füllung ist die Innenfarbe. Um eine Farbe festzulegen, senden Sie "set" an ein "NSColor" -Objekt.

Damit wird der Hub auf schwarz und die Füllung auf rot:

[[NSColor blackColor] setStroke]; 
[[NSColor redColor] setFill]; 

Jetzt, wo Sie Ihren Weg und Sie haben Ihre Farben den Pfad nur füllen gesetzt und es dann ziehen:

[path stroke]; 
[path fill]; 

All dies muss in einem Grafikkontext wie in DrawRect einer Ansicht vielleicht getan werden.Alle mit einem Grafikkontext dieser zusammen würde wie folgt aussehen:

- (void)drawRect:(NSRect)rect 
{ 
    // Get the graphics context that we are currently executing under 
    NSGraphicsContext* gc = [NSGraphicsContext currentContext]; 

    // Save the current graphics context settings 
    [gc saveGraphicsState]; 

    // Set the color in the current graphics context for future draw operations 
    [[NSColor blackColor] setStroke]; 
    [[NSColor redColor] setFill]; 

    // Create our circle path 
    NSRect rect = NSMakeRect(10, 10, 10, 10); 
    NSBezierPath* circlePath = [NSBezierPath bezierPath]; 
    [circlePath appendBezierPathWithOvalInRect: rect]; 

    // Outline and fill the path 
    [circlePath stroke]; 
    [circlePath fill]; 

    // Restore the context to what it was before we messed with it 
    [gc restoreGraphicsState]; 
} 
+1

Eine Menge der Syntax in dieser Antwort scheint ungenau. Existiert NSRect oder NSGraphicsContext überhaupt? –

+1

@EricBrotto Ich empfehle das Lesen auf den Link oben auf der Antwort zur Verfügung gestellt. – joshperry

+0

Danke für das Beispiel – Miek

7
CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(c, 40, 0, 255, 0.1); 
    CGContextSetRGBStrokeColor(c, 0, 40, 255, 0.5); 

    // Draw a green solid circle 
    CGContextSetRGBFillColor(c, 0, 255, 0, 1); 
    CGContextFillEllipseInRect(c, CGRectMake(100, 100, 25, 25)); 
+0

Ein Hinweis: 'CGContextSetRGBFillColor' und' CGContextSetRGBStrokeColor' nehmen Parameter von 0 -1,0, also sollten Sie keine in 8 Bits skalierten Werte verwenden (0-255). – gklka

12

Sie UIView einfach verwenden kann perfekt Kreis mit nur Parameter radius zu erstellen:

// Add framework CoreGraphics.framework 
#import <QuartzCore/QuartzCore.h> 

-(UIView *)circleWithColor:(UIColor *)color radius:(int)radius { 
    UIView *circle = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 2 * radius, 2 * radius)]; 
    circle.backgroundColor = color; 
    circle.layer.cornerRadius = radius; 
    circle.layer.masksToBounds = YES; 
    return circle; 
} 
+0

In Zeile UIView * Kreis = [[[UIView Alloc] InitWithFrame: CGRectMake (0, 0, 2 * Radius, 2 * Radius)] Autorelease]; Stellen Sie sicher, dass Sie die Autorelease nur verwenden, wenn Sie ARC nicht verwenden. – tjpaul

+2

@tjsumpthun danke, ich habe den Beitrag aktualisiert (entfernen Sie die Autorelease), ich denke, die Leute nicht mehr nicht Lichtbogenentwicklung verwenden. –

Verwandte Themen