2008-12-09 7 views
14

Est-ce que quelqu'un peut me guider correctement pour construire un cercle/une bulle de couleur par programme?Créer un cercle/une bulle de couleur par programmation dans ObjectiveC et Cocoa

Je ne peux pas utiliser les images car j'en ai besoin pour avoir n'importe quelle couleur en fonction de l'interaction de l'utilisateur. Ma pensée était peut-être de faire une image en cercle blanc, puis de superposer une couleur sur le dessus de celle-ci. Cependant, je ne suis pas sûr si cela fonctionnerait, ou comment vraiment s'y prendre.

Si quelqu'un pouvait me diriger dans la bonne direction, je l'apprécierais.

Répondre

11

Créez une sous-classe NSView qui contient un NSColor en tant que ivar. Dans la méthode drawRect, créez un NSBezierPath de la taille appropriée, en utilisant les limites de la vue. Définissez ensuite la couleur [myColor set] et remplissez le chemin [myPath fill]. Vous pouvez en faire beaucoup plus, comme définir la transparence, une bordure, etc., mais je vais laisser cela aux docs à moins que vous n'ayez une question précise. Pour utiliser la sous-classe NSView, faites simplement glisser un objet de vue sur votre plume et choisissez le nom de votre sous-classe dans une classe personnalisée dans l'inspecteur d'IB. Vous devrez également définir une sortie dans votre contrôleur, de sorte que vous pouvez changer la couleur au besoin.

+0

On dirait qu'il est encore a: bezierPathWithOvalInRect: Merci! – kdbdallas

+0

Ouais, c'est nouveau chez Leopard si je me souviens bien. Avant cela, l'une des toutes premières choses que les programmeurs de Cocoa débutants (moi compris) avaient à faire était de définir une catégorie dans NSBezierPath pour créer un chemin rectangle circulaire ou arrondi. :) –

2

Télécharger le croquis de apple. Il peut faire beaucoup plus, mais l'une des choses est les cercles de dessin.

31

Il y a quelques étapes pour dessiner quelque chose dans Cocoa.

D'abord vous avez besoin d'un chemin qui sera utilisé pour définir l'objet que vous allez dessiner. Jetez un oeil ici Drawing Fundamental Shapes pour un guide sur la création de chemins dans Cocoa. Vous serez plus intéressé à envoyer le message "appendBezierPathWithOvalInRect" à un objet "NSBezierPath", cela prend un rectangle qui délimite le cercle que vous voulez dessiner.

Ce code va créer un cercle 10x10 aux coordonnées 10,10:

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

Une fois que vous avez votre chemin que vous voulez définir la couleur pour le contexte de dessin en cours. Il y a deux couleurs, trait et remplissage; le trait est le contour du tracé et le remplissage est la couleur intérieure. Pour définir une couleur, envoyez "set" à un objet "NSColor".

Ceci définit la course au noir et le remplissage rouge:

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

Maintenant que vous avez votre chemin et vous avez vos couleurs définies il suffit de remplir le chemin, puis dessiner:

[path stroke]; 
[path fill]; 

Tout cela devra être fait dans un contexte graphique comme dans drawRect d'une vue peut-être.Tout cela avec un contexte graphique ressemblerait à ceci:

- (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

Beaucoup de syntaxe dans cette réponse semble inexacte. Est-ce que NSRect ou NSGraphicsContext existent même? –

+1

@EricBrotto Je recommande de lire sur le lien fourni en haut de la réponse. – joshperry

+0

Merci pour l'exemple – 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

Une remarque: 'CGContextSetRGBFillColor' et' CGContextSetRGBStrokeColor' prennent des paramètres à partir de 0 -1,0, vous ne devriez donc pas utiliser des valeurs mises à l'échelle en 8 bits (0-255). – gklka

12

Vous peut utiliser simplement UIView pour créer cercle parfait avec seul paramètre radius:

// 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

En ligne UIView * circle = [[[UIView alloc] initWithFrame: CGRectMake (rayon 0, 0, 2 *, rayon 2 *)] autorelease]; assurez-vous de n'utiliser la libération automatique que si vous n'utilisez pas ARC. – tjpaul

+2

@tjsumpthun merci, j'ai mis à jour le post (enlever la autorelease), je pense que les gens n'utilisent plus le développement non arc. –

Questions connexes