2013-04-16 4 views
1

У меня есть UIView, который программно рисует рисунок «sunburst», используя UIBezierPath. Теперь я хотел бы расширить это, маскируя края градиентом - эффективно, чтобы каждый «взрыв» исчезал от непрозрачного до прозрачного. Я думаю, что это можно сделать с помощью маски CAGradientLayer, но я не уверен, как сделать ее круговой.Circular CAGradientLayer Mask

Это то, что я пытаюсь - это маскирует вид, но градиент является линейным:

CAGradientLayer *l = [CAGradientLayer layer]; 
    l.frame = CGRectMake(0.0f, 0.0f, rect.size.width, rect.size.height); 
    l.cornerRadius = rect.size.width/2.0f; 
    l.masksToBounds = YES; 
    l.colors = [NSArray arrayWithObjects:(id)[UIColor blackColor].CGColor, (id)[UIColor clearColor].CGColor, nil]; 
    self.layer.mask = l; 

Я открыт не с помощью CAGradientLayer если кто-нибудь знает какие-нибудь другие способы замаскировать вид с круг с размытыми краями.

РЕШЕНИЕ Благодаря проницательности Мэтта, я закончил рисовать вид маски с использованием CGContextDrawRadialGradient, делая это как UIImage, и он используется в качестве маски слоя. Если кто-то заинтересован в этом процессе, он используется в this test project.

ответ

1

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

С другой стороны, может быть достаточно сделать радиальный градиент и использовать его в качестве маски (эффект виньетки). Core Graphics будет использовать радиальный градиент для вас:

https://developer.apple.com/library/ios/#documentation/graphicsimaging/reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextDrawRadialGradient

Я тоже очень люблю CIFilters для добавления штрихов, как это: вы должны смотреть через каталог и посмотреть, что поражает ваше воображение:

https://developer.apple.com/library/ios/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html

CIFilter фактически дает переход на солнечный переход, который может удовлетворить ваши цели, особенно в сочетании с маскировкой и компоновкой; вот обсуждение Sunburst (используется в анимации), из моей книги:

http://www.apeth.com/iOSBook/ch17.html#_cifilter_transitions

+0

У меня такое ощущение, что CGContextDrawRadialGradient может быть для этого. Я попробую. – Keller

+0

Я думаю, вы должны начать с CGContextDrawRadialGradient и * затем * размыть рисунок градиента с помощью CIFilter и использовать результат * этого * в качестве маски. :) – matt

+0

Я ДЕЙСТВИТЕЛЬНО близко к этому, поэтому я принял ответ. Я использую CGContextDrawRadialGradient, чтобы просто нарисовать круговой градиент над моим оригинальным представлением «sunburst». По сути, это работает отлично, если я сопоставляю цвет градиента с цветом фона. Но как я мог бы использовать свой UIView для градиента для маскировки исходного UIView sunburst (вариант использования, если я использую это на не сплошном фоне)? – Keller

0

CAGradientLayer рисует линейные градиенты.

Вы могли бы попытаться установить тень и посмотреть, если это соответствует вашим потребностям:

l.shadowColor = [UIColor blackColor]; 
l.shadowRadius = rect.size.width/2; 
+0

Это не делает, но спасибо. Я, очевидно, открыт, чтобы не использовать CAGradientLayer, если есть другой способ сделать круговую маску с размытым краем. – Keller

0

Вы можете сделать это путем создания экземпляра CALayer и придать ему делегат, который реализует drawLayer: InContext: и рисует радиальные градиент в реализации этого метода. Затем используйте этот CALayer в качестве маски.

 Смежные вопросы

  • Нет связанных вопросов^_^