CAGradientLayer неправильно рисует градиент

Я использую CAShapeLayer, чтобы нарисовать круг и установить его в качестве маски CAGradientLayer, вот код:

CAShapeLayer *circleShapeLayer = [CAShapelayer new];
// draw circle path code here...

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.colors = @[(__bridge id)[UIColor whiteColor].CGColor,
                         (__bridge id)[UIColor clearColor].CGColor];
// self here means a UIView
gradientLayer.mask = circleShapeLayer;
gradientLayer.frame = self.bounds;
[self.layer addSublayer:gradientLayer];

Когда я запускаю приложение, оно отображает градиентный круг, но градиент странный.

То, что я хочу, это круг, который в начальной точке, цвет белый, а в конечной точке цвет чистый, он должен выглядеть так:

Но цвет круга на экране симулятора:

Цвет симметричный.

Я думаю, что проблема в том, что я не устанавливаю gradientLayer.colors правильно, как я могу это исправить?

3 ответа

Решение

CAGradientLayer не может рисовать градиент вдоль дуги. с другой стороны, рамка слоя маски слишком мала, чем рамка градиентного слоя, чтобы видеть чистый цвет

К ответу Умайра, сначала это не имело смысла, потому что даже whiteColor или же blackColor выбирается colorWithRed:green:blue:alpha но потом я прочитал это в документации:

При рендеринге цвета отображаются в выходное цветовое пространство перед интерполяцией.

Так что, возможно, это действительно так:

gradientLayer.colors = @[(__bridge id)[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f].CGColor,
                         (__bridge id)[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:0.0f].CGColor];

@J.Hunter ответ правильный в этом CAGradientLayers не может рисовать по дуге. Это означает, что ваши нарисованные градиенты будут ограничены радиальными и линейными. Вы специально пытаетесь создать угловой градиент, что я пытался сделать и в прошлом.

К несчастью, CAGradientLayer связан с этими ограничениями, и лучший способ создания углового градиента, который я нашел, состоит в том, чтобы маскировать UIImage который содержит угловой градиент. Это будет не так динамично, как рисование собственного градиента, но на данный момент это лучший (возможно, единственный) вариант.

Другие вопросы по тегам