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 ответ правильный в этом CAGradientLayer
s не может рисовать по дуге. Это означает, что ваши нарисованные градиенты будут ограничены радиальными и линейными. Вы специально пытаетесь создать угловой градиент, что я пытался сделать и в прошлом.
К несчастью, CAGradientLayer
связан с этими ограничениями, и лучший способ создания углового градиента, который я нашел, состоит в том, чтобы маскировать UIImage
который содержит угловой градиент. Это будет не так динамично, как рисование собственного градиента, но на данный момент это лучший (возможно, единственный) вариант.