Рисуем линию с тенью, но хотим только сохранить тень. IOS - PullRequest
7 голосов
/ 09 сентября 2011

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

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

Следующий код создает 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);

Спасибо.

Ответы [ 2 ]

9 голосов
/ 09 сентября 2011

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

- (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);
}

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

2 голосов
/ 09 сентября 2011

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

...