Рисуем линию тенью, но хотим сохранить только тень. IOS

Я пытаюсь нарисовать линию с тенью, но я не хочу сохранять линию, а только тень.

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

Следующий код создает 2 строки, я хочу сохранить только тень, потому что она выглядит красивее и не имеет пикселизации, как линия.

Это возможно?

    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 2.0);

    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
    CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES);    

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[4] = {0.0, 0.0, 0.0, 1.0};
    CGColorRef shadowColor = CGColorCreate(colorSpace, components);
    CGContextSetShadowWithColor(UIGraphicsGetCurrentContext(), CGSizeMake(10,10), 4.0, shadowColor);

Спасибо.


person Rob    schedule 08.09.2011    source источник


Ответы (2)


Таким образом, вы не можете сделать это напрямую, потому что тень отражает путь, поэтому, если вы сделаете путь прозрачным, тень также будет прозрачной. Есть несколько обходных путей, которые я могу придумать (зависит от того, что именно вы делаете), но один хитрый способ - просто нарисовать тень достаточно далеко под путем, чтобы вы могли просто нарисовать ее, по сути стирая ее. Например, если фон белый, это выполнит то, что вы хотите:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);
    CGContextSetLineWidth(context, 10.0);
    CGContextMoveToPoint(context, 10.0, 30.0);
    CGContextAddLineToPoint(context, 310.0, 30.0);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[4] = {0.0, 0.0, 0.0, 1.0};
    CGColorRef shadowColor = CGColorCreate(colorSpace, components);
    CGContextSetShadowWithColor(context, CGSizeMake(0.0f,20.0f), 4.0, shadowColor);
    CGContextStrokePath(context);

    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextSetLineWidth(context, 10.0);
    CGContextMoveToPoint(context, 10.0, 30.0);
    CGContextAddLineToPoint(context, 310.0, 30.0);
    CGContextStrokePath(context);
}

надеюсь это поможет.

person pho0    schedule 08.09.2011

почему бы тебе просто не нарисовать свою линию как тень. Не рисуйте тень, а вместо этого нарисуйте черную линию с альфой 0,25 или меньше и сместите ее туда, где вы ожидаете, что тень будет.

person The Lazy Coder    schedule 08.09.2011