2008-12-09 24 views
14

bất cứ ai có thể hướng dẫn cho tôi trong cách chính xác để xây dựng một bong bóng màu/vòng tròn lập trình?Tạo một bong bóng màu/vòng tròn lập trình trong ObjectiveC và Cocoa

Tôi không thể sử dụng hình ảnh như tôi cần nó để có thể được bất kỳ màu sắc tùy thuộc vào tương tác người dùng.

suy nghĩ của tôi là có thể để tạo ra một hình ảnh vòng tròn trắng và sau đó phủ một màu sắc trên đầu trang của nó. Tuy nhiên tôi không chắc chắn nếu điều này sẽ làm việc, hoặc làm thế nào để thực sự đi về nó.

Nếu ai đó có thể chỉ cho tôi đúng hướng tôi sẽ đánh giá cao nó.

Trả lời

11

Tạo một lớp con NSView chứa một NSColor như một Ivar. Trong phương thức drawRect, tạo một NSBezierPath có kích thước phù hợp, sử dụng các giới hạn của khung nhìn. Sau đó, đặt màu [myColor set] và điền vào đường dẫn [myPath fill]. Có rất nhiều thứ bạn có thể làm, chẳng hạn như thiết lập độ trong suốt, đường viền, v.v .., nhưng tôi sẽ để lại tài liệu đó trừ khi bạn có câu hỏi cụ thể.

Để sử dụng lớp con NSView, chỉ cần kéo một đối tượng xem vào ngòi bút của bạn, và chọn tên của lớp con bạn trong lớp tùy chỉnh trong thanh tra IB của. Bạn cũng sẽ cần phải thiết lập một ổ cắm cho nó trong bộ điều khiển của bạn, vì vậy bạn có thể thay đổi màu sắc khi cần thiết.

+0

Hình như có thậm chí là a: bezierPathWithOvalInRect: Cảm ơn! – kdbdallas

+0

Yup, đó là tính năng mới trong Leopard nếu tôi nhớ chính xác. Trước đó, một trong những điều đầu tiên của những người lập trình Cocoa mới (bao gồm cả bản thân mình) phải làm là định nghĩa một thể loại trong NSBezierPath để tạo ra một đường tròn hình tròn hoặc tròn. :) –

31

Có một vài bước để vẽ thứ gì đó trong Cocoa.

Trước tiên, bạn cần một đường dẫn sẽ được sử dụng để xác định đối tượng mà bạn sắp vẽ. Hãy xem ở đây Drawing Fundamental Shapes để biết hướng dẫn về cách tạo đường dẫn trong Cocoa. Bạn sẽ quan tâm nhất đến việc gửi thông báo "appendBezierPathWithOvalInRect" tới một đối tượng "NSBezierPath", điều này có một hình chữ nhật bao quanh vòng tròn bạn muốn vẽ.

Mã này sẽ tạo ra một vòng tròn 10x10 tại tọa độ 10,10:

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

Một khi bạn có con đường của bạn, bạn muốn đặt màu cho bối cảnh bản vẽ hiện hành. Có hai màu, đột quỵ và tô màu; nét vẽ là đường viền của đường đi và tô màu là màu nội thất. Để đặt màu bạn gửi "set" thành đối tượng "NSColor".

này đặt đột quỵ sang màu đen và điền để đỏ:

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

Bây giờ bạn có con đường của bạn và bạn có màu sắc của bạn thiết lập chỉ cần điền đường dẫn và sau đó rút ra nó:

[path stroke]; 
[path fill]; 

Tất cả điều này sẽ cần phải được thực hiện trong một bối cảnh đồ họa như trong drawRect của một khung nhìn có lẽ.Tất cả điều này cùng với một bối cảnh đồ họa sẽ trông như thế này:

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

Rất nhiều cú pháp trong câu trả lời này có vẻ không chính xác. NSRect hoặc NSGraphicsContext có tồn tại không? –

+1

@EricBrotto Tôi khuyên bạn nên đọc tại liên kết được cung cấp ở đầu câu trả lời. – joshperry

+0

Cảm ơn ví dụ – 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

Một lưu ý: 'CGContextSetRGBFillColor' và' CGContextSetRGBStrokeColor' lấy tham số từ 0 -1.0, vì vậy bạn không nên sử dụng các giá trị được chia tỷ lệ trong 8 bit (0-255). – gklka

12

Bạn có thể sử dụng đơn giản UIView để tạo hoàn hảo vòng tròn với chỉ số 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

Trong dòng UIView * circle = [[[UIView alloc] initWithFrame: CGRectMake (0, 0, 2 * radius, 2 * radius)] autorelease]; hãy chắc chắn chỉ sử dụng tự động trả lời nếu bạn không sử dụng ARC. – tjpaul

+2

@tjsumpthun cảm ơn bạn, tôi đã cập nhật các bài viết (loại bỏ các autorelease), tôi nghĩ rằng mọi người không còn sử dụng không phát triển vòng cung. –

Các vấn đề liên quan