2008-12-09 42 views
14

任何人都可以用正確的方式引導我以編程方式構建一個彩色的氣泡/圓圈嗎?在ObjectiveC和Cocoa中以編程方式創建一個彩色的氣泡/圓形

我無法使用圖像,因爲我需要它可以是任何顏色,具體取決於用戶交互。

我的想法可能是製作一個白色的圓形圖像,然後在其上覆蓋一個顏色。 但是我不確定這是否會起作用,或者如何真正解決它。

如果有人能指出我正確的方向,我將不勝感激。

回答

11

創建一個NSView子類,其中包含一個NSColor作爲ivar。在drawRect方法中,使用視圖的邊界創建適當大小的NSBezierPath。然後設置顏色[myColor set]並填寫路徑[myPath fill]。你可以做更多的事情,比如設置透明度,邊框等等,但是除非你有特定的問題,否則我會把它留給文檔。

要使用NSView子類,只需將視圖對象拖到您的筆尖上,然後在IB的檢查器中的自定義類中選擇您的子類的名稱。您還需要在控制器中設置一個插座,以便根據需要更改顏色。

+0

看起來甚至有a:bezierPathWithOvalInRect:謝謝! – kdbdallas 2008-12-09 23:48:02

+0

是的,如果我沒有記錯的話,那是Leopard中的新功能。在此之前,新手Cocoa程序員(包括我自己)必須做的第一件事之一是在NSBezierPath中定義一個類別來創建一個圓形或圓角矩形路徑。 :) – 2008-12-10 00:11:23

31

有幾個步驟來繪製可可中的東西。

首先你需要一個路徑來定義你要繪製的對象。在這裏看看Drawing Fundamental Shapes關於在Cocoa中創建路徑的指南。您將最感興趣的是將「appendBezierPathWithOvalInRect」消息發送到「NSBezierPath」對象,這需要一個矩形來限定要繪製的圓。

此代碼將創建一個10×10圈在座標10,10:

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]; 
} 
+1

在這個答案很多的語法似乎不準確。 NSRect或NSGraphicsContext是否存在? – 2011-11-09 11:32:10

+1

@EricBrotto我建議您閱讀答案頂部的鏈接。 – joshperry 2011-11-09 14:29:05

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)); 
12

您可以使用簡單的UIView創建完美圈只有參數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; 
} 
相關問題