CGContextAddEllipse - обрезание перекрытия - Quartz

Мне нравится рисовать стакан с помощью нескольких Элементов - Верхний эллипс - Нижний эллипс - и Линии между ними.

Затем его следует заполнить градиентом. Элементы работают, но в точке, где середина стекла соприкасается с верхним или нижним эллипсом, область обрезается.

- (void)drawRect:(CGRect)rect
{
    CGPoint c = self.center;    
    // Drawing code
    CGContextRef cx = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(cx, 1.0);
    [[UIColor whiteColor] setStroke];

    //  DrawTheShapeOfTheGlass
    CGContextBeginPath(cx);
    //  Top and Bottom Ellipse
    CGContextAddEllipseInRect(cx, CGRectMake(0, 0, 100, 20));
    CGContextAddEllipseInRect(cx, CGRectMake(10, 90, 80, 20));
    //  Define the points for the Area inbetween
    CGPoint points[] = { {0.0,10.0},{10.0,100.0},{90.0,100.0},{100.0,10.0} };
    CGContextAddLines(cx, points, 4);
    CGContextClosePath(cx);
    //  Clip, that's only the Clipped-Area wil be filled with the Gradient
    CGContextClip(cx);

    //  CreateAndDraw the Gradient
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGFloat colorSpace[] = {1.0f, 1.0f, 1.0f, 0.0f,
                        0.0f, 0.0f, 1.0f, 1.0f };
    CGFloat locations[] = { 0.0, 1.0 };

    CGGradientRef myGradient = CGGradientCreateWithColorComponents(rgbColorSpace, colorSpace, locations, 2);

    CGPoint s = CGPointMake(0, 0);
    CGPoint e = CGPointMake(100, 100);
    CGContextDrawLinearGradient(cx, myGradient, s, e, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);

    CGColorSpaceRelease(rgbColorSpace);
    CGGradientRelease(myGradient);
}

Вот как это выглядит:

введите здесь описание изображения

Есть ли возможность «заполнить» весь эллипс? Я играл с BlendModes, но это не помогло.

Спасибо


person Thomas    schedule 29.07.2012    source источник


Ответы (1)


Попробуйте заменить код инициализации points[] следующим...

CGPoint points[] = {{0.0,10.0},{100.0,10.0},{90.0,100.0},{10.0,100.0}};

CoreGraphics использует правило ненулевого количества витков, чтобы определить, как заполнить путь. Поскольку эллипсы рисуются по часовой стрелке, а ваша трапеция рисуется против часовой стрелки, перекрывающиеся области не были заполнены. Изменение порядка рисования трапеции на по часовой стрелке приведет к тому, что объект будет полностью заполнен.

person 0x141E    schedule 10.08.2012