使用 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;
当我NSLog
shadowLayer
属性时,坐标和框架都是正确的。它与它所支持的视图相匹配。
我还在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 masksToBounds 应设置为 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 没有出现阴影的主要内容,如果未能解决你的问题,请参考以下文章
使用 UIViewPropertyAnimator 同步动画 CALayer 属性和 UIView
有没有办法让 CALayer 的动作字典永久优先于其 UIView 委托?