2009-05-02 42 views
5

Tôi đang cố gắng vẽ một số dòng mẫu với iPhone/Touch SDK. Tôi muốn để có thể thay đổi màu sắc của các dòng, nhưng gọi CGContextSetRGBStrokeColor dường như không ảnh hưởng đến các đường vẽ được thực hiện với CGContextAddLineToPoint cho đến khi thực tế cuộc gọi đến CGContextStrokePath được thực hiện. Vì vậy, nếu tôi thực hiện nhiều cuộc gọi để thay đổi màu sắc, chỉ có một cuộc gọi được thực hiện ngay trước khi CGContextStrokePath có hiệu lực. Dưới đây là ý tôi:Thay đổi màu bằng CGContextStrokePath

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextMoveToPoint(ctx, 0, 0); 
    CGContextSetRGBStrokeColor(ctx,1,0,0,1); 
    CGContextAddLineToPoint(ctx, 100, 100); 
    //CGContextStrokePath(ctx); 
    CGContextSetRGBStrokeColor(ctx,0,1,0,1); 
    CGContextAddLineToPoint(ctx, 200, 300); 
    //CGContextStrokePath(ctx); 
    CGContextSetRGBStrokeColor(ctx,0,0,1,1); 
    CGContextStrokePath(ctx); 
} 

Tôi cho rằng tôi đang làm điều gì đó khủng khiếp sai, tôi không thể hiểu được điều gì. Tôi nghĩ rằng nếu tôi thêm các cuộc gọi CGContextStrokePath, điều đó sẽ giúp ích, nó không có.

Xem thảo luận dưới đây để biết làm thế nào tôi có vào mã chỉnh:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, 0, 0); 
    CGContextSetRGBStrokeColor(ctx,1,0,0,1); 
    CGContextAddLineToPoint(ctx, 100, 100); 
    CGContextStrokePath(ctx); 
    CGContextClosePath(ctx); 
    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, 100, 100); 
    CGContextSetRGBStrokeColor(ctx,0,1,0,1); 
    CGContextAddLineToPoint(ctx, 200, 300); 
    CGContextStrokePath(ctx); 
} 

Trả lời

4

Tôi không nghĩ rằng bạn đang làm bất cứ điều gì khủng khiếp sai, chỉ là CGContextStrokePath cho một bối cảnh Graphics đưa ra chỉ có thể có một RGBStrokeColor tại một thời gian. Kết quả là, nhiều cuộc gọi đến CGContextStrokePath là bắt buộc, một lần cho mỗi màu.

Tham chiếu (không phải bản sao) cho ngữ cảnh đồ họa được thêm vào chồng các thao tác vẽ đó với mỗi lệnh gọi tới CGContextAddLineToPoint(). Khi bạn gọi CGContextStrokePath(), giá trị cuối cùng cho RGBStrokeColor được sử dụng.

Nếu bạn muốn sử dụng nhiều màu với cùng một bối cảnh đồ họa, thì có vẻ như bạn cần thực hiện nhiều cuộc gọi tới CGContextStrokePath() thay đổi giá trị RGBStrokeColor() trên ngữ cảnh đồ họa giữa các cuộc gọi. Mã mẫu của Apple trong AccelerometerGraph/GraphView.m cũng xuất hiện để biểu thị điều này.

+0

Hm, Đó là kết luận tôi cũng đã đến, nhưng khi tôi chạy mã ở trên trong trình mô phỏng với dòng CGContextStrokePath (ctx) không nhận xét, tôi nhận được dòng đầu tiên được vẽ bằng màu đỏ và sau đó không có gì. Những gì nó trông với tôi như nó nên làm, là vẽ dòng đầu tiên màu đỏ, và sau đó rút ra thứ hai trong màu xanh lá cây, nhưng nếu tôi chạy nó trong giả lập iPhone, đó không phải là những gì sẽ xảy ra. – stinkymatt

+0

Có lẽ đường dẫn hiện tại (bao gồm cả điểm bắt đầu) bị xóa khi bạn thực hiện cuộc gọi đầu tiên? Theo tài liệu của Apple - "Quartz sử dụng độ rộng đường nét và màu sắc nét của trạng thái đồ họa để vẽ đường dẫn. Như một tác dụng phụ khi bạn gọi hàm này, Quartz xóa đường dẫn hiện tại." –

+0

Đầu tiên, tôi khen bạn về việc bạn sử dụng từ bị xóa. Đó là một trong những sở thích của tôi. Thứ hai, tôi cảm ơn bạn đã giúp tôi xem tài liệu theo một cách khác. Điều phải làm là gọi CGContextBeginPath (ctx). Sau đó thay đổi màu sắc nét, di chuyển điểm bắt đầu, và thêm dòng, sau đó đột quỵ và đóng đường dẫn. Lặp lại cho các đoạn đường tiếp theo. Tôi sẽ cố gắng thêm mã đã sửa vào bài đăng gốc của tôi cho hậu thế. Cảm ơn! – stinkymatt

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