Тень не отображается для UIView с использованием CALayer - PullRequest
6 голосов
/ 08 ноября 2011

У меня есть подкласс UIView, загруженный из пера, и я не могу получить тень вокруг него. Я пытаюсь заставить тень появляться вокруг всего вида в течение довольно продолжительного времени. Я решил поместить его в свой собственный подслой, чтобы упростить анимацию позже. Вот код:

-(void)awakeFromNib 
{
    self.clipsToBounds = NO;

    // set up the shadow layer
    CALayer *shadow = [CALayer layer];
    shadow.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, self.bounds.size.height);
    shadow.shadowColor = [UIColor blueColor].CGColor;
    shadow.shadowRadius = 15.0;
    shadow.opacity = 1.0;
    [self.layer addSublayer:shadow];
    // I set this property so I have access to it later to more easily animate it.
    self.shadowLayer = shadow;
}

Когда I NSLog свойство shadowLayer, координаты и фрейм верны. Это соответствует представлению, которое оно поддерживает.

Я также установил цвет границы и радиус угла на self.layer, и он отображается правильно. Если я нанесу тень на self.layer, она появится, но она охватывает все подпредставления моего родителя UIView.

Любая помощь очень ценится.

Ответы [ 4 ]

3 голосов
/ 08 ноября 2011

Я предполагаю, что вы импортировали QuartzCore.Я думаю, вам нужно установить и создать границу для UIView.Способ использования этого [self roundedLayerWithShadow:yourView.layer radius:5.0f];

- (void)roundedLayerWithShadow:(CALayer *)viewLayer 
                        radius:(float)r 
{
    [viewLayer setMasksToBounds:YES];
    [viewLayer setCornerRadius:r];        
    [viewLayer setBorderColor:[RGB(180, 180, 180) CGColor]];
    [viewLayer setBorderWidth:1.0f];

    [viewLayer setShadowColor:[RGB(0, 0, 0) CGColor]];
    [viewLayer setShadowOffset:CGSizeMake(0, 0)];
    [viewLayer setShadowOpacity:1];
    [viewLayer setShadowRadius:2.0];
    return;
}
1 голос
/ 28 марта 2017

Я боролся с тем же, и получается, что вам нужно установить shadowOpacity на 1,0.В вашем коде вы случайно используете opacity вместо shadowOpacity.Это та же проблема, что и у меня.

0 голосов
/ 20 сентября 2018

В общем, для появления тени:

  • shadowOpacity должно быть больше 0
  • shadowRadius должен быть больше 0
  • masksToBounds следует установить в значение false (чтобы избежать отсечения тени)
  • shadowColor должен отличаться от цвета фона суперпредставления вида

Swift 4.2. пример реализации:

let myCustomView = MyCustomView()
myCustomView.layer.shadowColor = UIColor.black.cgColor
myCustomView.layer.shadowOpacity = 0.15
myCustomView.layer.shadowRadius = 5
myCustomView.layer.masksToBounds = false
myCustomView.layer.shadowOffset = CGSize(width: 0, height: 2)
0 голосов
/ 09 ноября 2011

Помимо borderRadius, ваш слой shadow выглядит очень прозрачным.Поэтому он не будет отбрасывать тени на shadow.superlayer.

...