使用BezierPath的UIView Shadow大量偏移阴影

时间:2017-10-17 19:26:53

标签: ios swift uiview shadow

我为UIView添加了一个阴影,但得到以下结果:

enter image description here

代码如下:

mainView.layer.cornerRadius = 8
mainView.layer.shadowColor = UIColor.black.cgColor
mainView.layer.shadowOpacity = 0.2
mainView.layer.shadowRadius = 10
mainView.clipsToBounds = false
mainView.backgroundColor = UIColor.blue
mainView.layer.shadowPath = UIBezierPath(roundedRect: mainView.frame, cornerRadius: 8).cgPath

鉴于我将shadowPath作为蓝色视图(mainView)的确切帧,我不明白为什么阴影如此偏移。我理解我可以使用shadowOffset属性修复此问题,但我尝试使用shadowPath的全部原因是使用shadowOffset,因为它可能会出现一些大规模的性能问题。

更新:将mainView.frame修复为mainView.bounds后,阴影已正确对齐。然而,阴影似乎仍然在mainView的顶部略微偏移(上面有一个更强的阴影):

enter image description here

2 个答案:

答案 0 :(得分:1)

请注意,阴影是在视图的坐标中指定的,因此您应该使用mainView.bounds

mainView.layer.shadowPath = UIBezierPath(roundedRect: mainView.bounds, cornerRadius: 8).cgPath

换句话说,您需要一个原点(0, 0)的矩形,而不是mainView的位置。

答案 1 :(得分:0)

  

在mainView的顶部,阴影似乎仍然有些偏移

这是因为shadowOffset的默认值为(0.0, -3.0)

https://developer.apple.com/documentation/quartzcore/calayer/1410970-shadowoffset

为避免这种情况,您可以使用offsetBy

mainView.layer.shadowPath = UIBezierPath(roundedRect: mainView.bounds.offsetBy(dx: 0.0, dy: 3.0), cornerRadius: 8).cgPath

或者简单地,将.zero传递给shadowOffset

mainView.layer.shadowOffset = .zero