2010-06-06 32 views
36

điền một con đường với một màu rất dễ dàng đủ:Làm thế nào để điền vào một đường dẫn với gradient trong drawRect :?

CGPoint aPoint; 
for (id pointValue in points) 
{ 
    aPoint = [pointValue CGPointValue]; 
    CGContextAddLineToPoint(context, aPoint.x, aPoint.y); 
} 
[[UIColor redColor] setFill]; 
[[UIColor blackColor] setStroke]; 
CGContextDrawPath(context, kCGPathFillStroke); 

Tôi muốn vẽ một gradient thay vì màu đỏ rắn, nhưng tôi đang gặp khó khăn. Tôi đã thử các mã được liệt kê trong câu hỏi/trả lời: Gradients on UIView and UILabels On iPhone

đó là:

CAGradientLayer *gradient = [CAGradientLayer layer]; 
[gradient setFrame:rect]; 
[gradient setColors:[NSArray arrayWithObjects:(id)[[UIColor blueColor] CGColor], 
       (id)[[UIColor whiteColor] CGColor], nil]]; 
[[self layer] setMasksToBounds:YES]; 

[[self layer] insertSublayer:gradient atIndex:0]; 

Tuy nhiên, điều này vẽ nên xem toàn bộ rằng đây là với gradient, bao che cho con đường ban đầu của tôi.

Trả lời

89

Tôi sẽ ghi vào đường dẫn bạn muốn điền và sử dụng CGContextDrawLinearGradient. Dưới đây là cách triển khai drawRect đơn giản: ví dụ:

- (void) drawRect:(CGRect)rect 
{ 
    // Create a gradient from white to red 
    CGFloat colors [] = { 
     1.0, 1.0, 1.0, 1.0, 
     1.0, 0.0, 0.0, 1.0 
    }; 

    CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB(); 
    CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2); 
    CGColorSpaceRelease(baseSpace), baseSpace = NULL; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSaveGState(context); 
    CGContextAddEllipseInRect(context, rect); 
    CGContextClip(context); 

    CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); 
    CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); 

    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); 
    CGGradientRelease(gradient), gradient = NULL; 

    CGContextRestoreGState(context); 

    CGContextAddEllipseInRect(context, rect); 
    CGContextDrawPath(context, kCGPathStroke); 
} 
+1

Nếu tôi có thể mang đến cho bạn huy hiệu tuyệt vời tôi sẽ làm! Bạn có biết bất kỳ hướng dẫn nào về CGContextSaveGState và nội dung không? Bởi vì tham khảo lớp táo là loại mỏng. – Derrick

+0

Derrick: Hướng dẫn lập trình 2D của Quartz bao gồm, cùng với mọi thứ khác: http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html#//apple_ref/doc/ uid/TP30001066-CH202-TPXREF132 –

+1

Sau khi sử dụng mã ví dụ của bạn, bóng của tôi đã biến mất. Tôi đã thử di chuyển đường bóng ("CGContextSetShadow (bối cảnh, CGSizeMake (5.0, -5.0), 4);") trước khi gstate lưu, sau khi nó, befroe phục hồi gstate, sau đó, trước và sau khi cắt - không có gì đã giúp. – Doron

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