Objective c 在Objective和Cocoa中以编程方式创建彩色气泡/圆

Objective c 在Objective和Cocoa中以编程方式创建彩色气泡/圆,objective-c,cocoa,drawing,Objective C,Cocoa,Drawing,有谁能指导我以正确的方式编程构建彩色气泡/圆圈吗 我不能使用图像,因为我需要它可以是任何颜色,取决于用户交互 我的想法是可能制作一个白色的圆圈图像,然后在上面覆盖一种颜色。 然而,我不确定这是否有效,或者如何真正做到这一点 如果有人能给我指出正确的方向,我将不胜感激。创建一个NSView子类,将NSColor作为ivar保存。在drawRect方法中,使用视图的边界创建适当大小的NSBezierPath。然后设置颜色[myColor set]并填充路径[myPath fill]。你还可以做很多事

有谁能指导我以正确的方式编程构建彩色气泡/圆圈吗

我不能使用图像,因为我需要它可以是任何颜色,取决于用户交互

我的想法是可能制作一个白色的圆圈图像,然后在上面覆盖一种颜色。 然而,我不确定这是否有效,或者如何真正做到这一点


如果有人能给我指出正确的方向,我将不胜感激。

创建一个NSView子类,将NSColor作为ivar保存。在drawRect方法中,使用视图的边界创建适当大小的NSBezierPath。然后设置颜色
[myColor set]
并填充路径
[myPath fill]
。你还可以做很多事情,比如设置透明度、边框等等,但是我会把这些留给文档,除非你有具体的问题


要使用NSView子类,只需将视图对象拖到nib上,然后在IB的inspector中的custom class中选择子类的名称。您还需要在控制器中设置插座,以便根据需要更改颜色。

从apple下载草图


它可以做更多的事情,但其中一件事是画圆。

用可可粉画东西有几个步骤

首先,需要一个用于定义要绘制的对象的路径。在这里查看有关在Cocoa中创建路径的指南。您最感兴趣的是将“appendBezierPathWithOvalInRect”消息发送到一个“NSBezierPath”对象,该对象使用一个矩形来限定要绘制的圆

该代码将在坐标10,10处创建一个10x10的圆:

NSRect rect = NSMakeRect(10, 10, 10, 10);
NSBezierPath* circlePath = [NSBezierPath bezierPath];
[circlePath appendBezierPathWithOvalInRect: rect];
获得路径后,需要为当前图形上下文设置颜色。有两种颜色,笔画和填充;笔划是路径的轮廓,填充是内部颜色。要设置颜色,请将“set”发送到“NSColor”对象

这将笔划设置为黑色,填充设置为红色:

[[NSColor blackColor] setStroke];
[[NSColor redColor] setFill];
现在您已经有了路径,并且设置了颜色,只需填充路径,然后绘制它:

[path stroke];
[path fill];
所有这些都需要在图形上下文中完成,比如在视图的drawRect中。所有这些加上图形上下文将如下所示:

- (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];
}

您可以使用simple
UIView
创建只有参数
半径的完美圆:

// 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;
}
//添加框架CoreGraphics.framework
#进口
-(UIView*)圆形WithColor:(UIColor*)颜色半径:(int)半径{
UIView*圆=[[UIView alloc]initWithFrame:CGRectMake(0,0,2*半径,2*半径)];
circle.backgroundColor=颜色;
circle.layer.cornerRadius=半径;
circle.layer.masksToBounds=是;
返回圈;
}

看起来甚至还有一个:bezierPathWithOvalInRect:谢谢!是的,如果我没记错的话,这在Leopard中是新的。在此之前,新手Cocoa程序员(包括我自己)必须做的第一件事就是在NSBezierPath中定义一个类别,以创建一个圆形或圆形矩形路径这个答案中的许多语法似乎不准确。NSRect或NSGraphicsContext是否存在?@EricBrotto我建议阅读答案顶部提供的链接。@EricBrotto是
NSRect
NSGraphicsContext
在MacOS上存在。因此,在该平台上编写ObjC+Cocoa时,这些结构/类确实存在。在iOS上,使用CG*等价物。请参见示例:如果要为圆的颜色设置动画,该怎么办
drawRect
不是line UIView*circle=[[[UIView alloc]initWithFrame:cDirectMake(0,0,2*半径,2*半径)]自动释放]中的最佳解决方案;确保只有在不使用ARC时才使用自动释放。@tjsumpthun谢谢,我已经更新了帖子(删除自动释放),我认为人们不再使用非ARC开发。注意:
CGContextSetRGBFillColor
CGContextSetRGBStrokeColor
采用0-1.0的参数,因此不应使用8位缩放的值(0-255).
// 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;
}