使用 CALayer 的 UIView 没有出现阴影

Posted

技术标签:

【中文标题】使用 CALayer 的 UIView 没有出现阴影【英文标题】:Shadow not appearing for UIView using CALayer 【发布时间】:2011-11-08 02:06:02 【问题描述】:

我有一个从笔尖加载的子类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;

当我NSLogshadowLayer属性时,坐标和框架都是正确的。它与它所支持的视图相匹配。

我还在self.layer 上设置了边框颜色和圆角半径,它显示正确。如果我将阴影放在self.layer 上,它会出现,但它包含我父母UIView 的所有子视图。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

假设您已导入 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;

【讨论】:

如果我有两个阴影怎么办?【参考方案2】:

我也遇到了同样的问题,结果你需要将shadowOpacity 设置为 1.0。在您的代码中,您不小心使用了opacity 而不是shadowOpacity。这和我遇到的问题一样。

【讨论】:

【参考方案3】:

一般来说,要出现阴影:

shadowOpacity 应该大于 0 shadowRadius 应该大于 0 ma​​sksToBounds 应设置为 false(以避免剪切阴影) shadowColor 应该不同于视图父视图的背景颜色

斯威夫特 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)

【讨论】:

【参考方案4】:

除了borderRadius,您的shadow 图层看起来非常透明。因此它不会在shadow.superlayer 上留下任何阴影。

【讨论】:

阴影为蓝色且不透明。据我所知,它没有理由不可见。

以上是关于使用 CALayer 的 UIView 没有出现阴影的主要内容,如果未能解决你的问题,请参考以下文章

UIView与CALayer的区别

使用 UIViewPropertyAnimator 同步动画 CALayer 属性和 UIView

如何将 UIView 添加到 CALayer

有没有办法让 CALayer 的动作字典永久优先于其 UIView 委托?

更改 UIView 的 CALayer (self.view.layer.frame = ...) 的框架似乎没有效果

UIVIew/CALayer 动画期间的回调