В iOS Development, используя Core Graphics и / или Quartz 2D, как я могу нарисовать круг, заполненный градиентом таким образом, чтобы он выглядел как сфера? - PullRequest
6 голосов
/ 10 июля 2011

До сих пор я смотрел на использование CGContextDrawLinearGradient () и CGContextDrawRadialGradient (), однако с первым я не могу понять, как сделать градиент похожим на сферу, а с последним я не могу понять как сделать градиент в форме сферы, потому что каждый раз, когда я пытаюсь, он получается в форме полного цилиндра, а не только сферы.

Код, который я использую для рисования 2D круга, показан ниже. Я хотел бы использовать градиент или любой другой метод, используя только Core Graphics и / или Quartz 2D, чтобы заполнить круг таким образом, чтобы он выглядел как сфера.

Текущий код для рисования круга:

CGContextRef ctx = UIGraphicsGetCurrentContext();
float x = 20.0;
float y = 20.0;
float radius = 12.5;
CGContextFillEllipseInRect(ctx, CGRectMake(x, y, radius, radius);

P.S. - Приведенный выше код работает так, как и предполагалось, поэтому в случае каких-либо ошибок они возникают только из-за моих ошибок при вводе вопроса, а не при вводе кода в реальный файл.

1 Ответ

8 голосов
/ 10 июля 2011

Я считаю, что это эффект, который вы ищете:

enter image description here

Это создано с использованием радиального градиента. Градиент начинается с радиуса 0 и заканчивается радиусом размера круга. Центральная точка начала должна быть внутри круга, созданного концом, иначе вы получите форму конуса. Вот код, который я использовал для создания этого изображения (перед тем, как использовать его, необходимо перевести несколько частей на iOS):

CGContextRef ctxt = [[NSGraphicsContext currentContext] graphicsPort];
CGGradientRef gradient;
CGColorSpaceRef colorSpace;
CGFloat locations[] = {0.0,1.0};
CGFloat components[] = { 0.5,1.0,1.0,1.0, 0.25,0.5,0.5,1.0 };
colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
gradient = CGGradientCreateWithColorComponents(colorSpace,components,locations,
                                               sizeof(locations)/sizeof(CGFloat));
CGPoint start = {70.0,130.0}, end = {100.0,100.0};
CGFloat startRadius = 0.0, endRadius = 90.0;
CGContextDrawRadialGradient(ctxt,gradient,start,startRadius,end,endRadius,0);
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);
...