2012-04-09 2 views
1

Я могу использовать CGContextDrawRadialGradient, чтобы сделать сферу, которая делает альфа-затухание до UIColor.clearColor, и это работает.CGContextDrawRadialGradient for Non-Circular Glow

Однако я пытаюсь сделать этот тип вещи:

enter image description here

При размещении некоторых стратегических сфер вокруг делает интересный эффект (по аналогии с LED подсветок в стратегических местах), я хотел бы чтобы получить истинное свечение. Как я могу нарисовать свечение вокруг закругленного прямоугольника в drawRect?

+0

Достаточно ли цветной тени? –

+0

@ IanHenry на самом деле не потому, что он внезапно закончится, а не постепенно станет альфа. Я понимаю, что я мог бы сделать несколько «колец» различной альфы, но я ищу что-то менее взломанное. –

+1

Размытие тени можно изменить в 'CGContextSetShadowWithColor'; что позволяет вам делать что-то очень похожее на изображение, которое вы показали (вы не получаете точного контроля над градиентом тени). –

ответ

2

Вы можете создать эффект свечения вокруг любого пути, используя CGContextSetShadowWithColor, но вы не получите точного контроля над внешним видом. В частности, тень по умолчанию достаточно света:

the default shadow

И единственный способ, которым я знаю, чтобы сделать его темнее, чтобы сделать его снова над собой:

enter image description here

не является оптимальным, но он приближается к тому, что вы хотите очень хорошо.

Этих изображений были получены с помощью следующей drawRect:

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

    CGMutablePathRef path = CGPathCreateMutable(); 

    int padding = 20; 
    CGPathMoveToPoint(path, NULL, padding, padding); 
    CGPathAddLineToPoint(path, NULL, rect.size.width - padding, rect.size.height/2); 
    CGPathAddLineToPoint(path, NULL, padding, rect.size.height - padding); 

    CGContextSetShadowWithColor(context, CGSizeZero, 20, UIColor.redColor.CGColor); 
    CGContextSetFillColorWithColor(context, UIColor.blueColor.CGColor); 

    CGContextAddPath(context, path); 
    CGContextFillPath(context); 
    // CGContextAddPath(context, path); 
    // CGContextFillPath(context); 

    CGPathRelease(path); 
} 

Одна вещи, чтобы иметь в виде, что делает нечеткую тень довольно дорого, что может или не может быть проблемой, в зависимости от того, как часто ваших взглядов перерисованы. Если тени не нужны для анимации, подумайте о том, чтобы сделать их одним из UIImage и просто отобразить результат в UIImageView.

+0

, по вашему мнению, это дороже, чем 2-цветные градиенты? Я предполагаю, что это будет похоже. –

+1

Если вы рисуете радиальный градиент, это, вероятно, дешевле тени для произвольного пути, но если вы выяснили способ рисовать градиенты в той же форме, что и тень, то, вероятно, это точно так же. Только тестирование скажет! –

+0

Я положу это в «проверять» мусорный бак, который довольно большой и редко получает опорожненным (если только не существует проблемы с производительностью или памятью). Еще раз спасибо –