无法在图像视图拉伸到其边界的图层上设置cornerRadius AND阴影?

Ben*_*tto 18 core-animation roundedcorners-dropshadow calayer uiview uiimageview

这让我很难过.我有一个UIView(称之为"父").该视图的最底层子视图是UIImageView(称为"child"),其框架占据整个"父"边界.

我想围绕"父"视图的角落,并设置投影.我CALayer像往常一样在"父母"这样做:

[[parent layer] setShadowOffset:CGSizeMake(5, 5)];
[[parent layer] setShadowRadius:6];
[[parent layer] setShadowOpacity:0.4];    
[[parent layer] setCornerRadius:6];
Run Code Online (Sandbox Code Playgroud)

这会正确显示阴影,但不会使角落变圆.

这是踢球者:

  1. 如果我删除"子"图像视图,或者缩小它以使其不占据"父"视图的整个边界,我会在父级上正确获得圆角和阴影.
  2. 如果我单独留下"孩子"但在"父"视图上设置"clipsToBounds",我会正确地得到角落.但现在阴影消失了.
  3. 孩子的图层上设置角半径似乎也没有效果.

看起来"子"图像视图只是模糊了"父"视图上的圆角,因为它占据了整个矩形,而基于父视图的剪切获得了角落,但也掩盖了阴影.不确定为什么#3不起作用.

我错过了什么?通过长时间盯着这个,我是否忽视了一些明显的东西?

谢谢.

(令人震惊的是,标签"roundcorners-dropshadow"已经存在.太棒了.)

Jul*_* D. 21

您将需要两个嵌套视图,内部一个设置圆角和剪切绑定,外部视图具有阴影(因此不剪切).在你的情况下,内部和外部视图可能是"child"和"parent",但我猜你没有为这些视图设置正确的剪切值?

请参阅为什么maskToBounds = YES中的答案可以防止CALayer阴影?.


Mat*_*ong 5

通常你必须将clipsToBounds设置为圆角,但由于你想要保留阴影,你也必须绕过阴影的角.您是否尝试使用贝塞尔曲线路径设置阴影路径?将clipsToBounds/masksToBounds保持为默认值NO.就像是:

  [[parent layer] setCornerRadius:6.0f];
  [[parent layer] setShadowPath:
             [[UIBezierPath bezierPathWithRoundedRect:[parent bounds] 
                   cornerRadius:6.0f] CGPath]];
Run Code Online (Sandbox Code Playgroud)