UIView CAG Градиент с закругленными углами? - PullRequest
1 голос
/ 25 ноября 2011

У меня есть UIView с закругленными углами и тенью, реализовано и работает.Но у UIView скучный цвет фона, белый.Поэтому я хочу поместить градиентный слой в качестве фона.Под метками, кнопками и, самое главное, сделайте так, чтобы закругленные углы все еще появлялись.

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = subHudView.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
[subHudView.layer addSublayer:gradient];
subHudView.layer.cornerRadius = 8;
subHudView.layer.masksToBounds = NO;
subHudView.layer.shadowOffset = CGSizeMake(-5, 5);
subHudView.layer.shadowRadius = 8;
subHudView.layer.shadowOpacity = 0.75;

Это мой код, когда я пытался его реализовать, но слой градиента находится поверх всего, что известно в представлении.Как я могу сделать градиент под всеми элементами управления и надписями?Будем благодарны за любую ответную помощь.

Ответы [ 5 ]

2 голосов
/ 25 ноября 2011

Слой, добавленный к вашему виду (addSublayer), рисуется перед собственным слоем вашего вида, где и происходит рисование всего вашего вида. Вам нужно нарисовать градиент в своем слое вида. Для этого внедрите +layerClass в ваше представление, указав, что вы хотите, чтобы слой вашего представления был градиентным представлением.

Так, например (в собственном коде представления):

+(Class)layerClass {
    return [CAGradientLayer class];
}

-(void)awakeFromNib {
    [super awakeFromNib];
    CAGradientLayer* layer = (CAGradientLayer*)self.layer;
    layer.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
    layer.cornerRadius = 8;
    layer.masksToBounds = NO;
    layer.shadowOffset = CGSizeMake(-5, 5);
    layer.shadowRadius = 8;
    layer.shadowOpacity = 0.75;
}

Если затем вы реализуете drawRect:, вы, конечно, уничтожите свой градиент и закругленные углы. Есть способы обойти это ...

1 голос
/ 26 ноября 2018

в Свифте:

let gradientLayer = CAGradientLayer()
gradientLayer.cornerRadius = 20.0
1 голос
/ 25 ноября 2011

Когда вы addSublayer: добавляете слой вверху всех подслоев.

Вы, вероятно, должны использовать что-то подобное вместо этого:

[subHudView.layer insertSublayer:gradient atIndex:0];

Таким образом, CAGradientLayer будет ниже всего остального.

0 голосов
/ 25 ноября 2011

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

+ (Class)layerClass
{
    return [CAGradientLayer class];
}

Это гарантирует, что ваше представление создаст CAGradientLayer, а не базовый CALayer, в качестве базового слоя.

Затем, во время инициализации, возьмите слой:

CAGradientLayer *gradLayer = self.layer;
gradLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];

и назначьте ему градиенты.

Красиво и чисто ...

0 голосов
/ 25 ноября 2011

Помимо insertSublayer: atIndex:, предложенного gcamp, вы также можете использовать insertSublayer: вышеуказанный: и insertSublayer: нижний: для размещения слоя в определенных местах.

[self.view.layer insertSublayer:gradient below:someUIObject];
...