在多个UIView后面添加阴影效果

3

在这个视图中,有多个子视图。现在我已经配置了视图以显示屏幕截图中所示的阴影:视图也会将阴影投射到其他视图上。您是否知道一种容易使阴影出现在所有视图后面的方法?即所有阴影的z-index < 所有视图的z-index。

我已经尝试为每个框创建一个额外的视图,并将所有这些阴影视图放置在所有框的后面。这种做法有点用,但是当使用PanGesture移动框时存在问题。此外,这种设计看起来有点凌乱。目前,每个框都有一个UIView,这是一个清晰的设计。

this


你说的“有缺乏”是什么意思? - dr_barto
当移动视图并使其投下阴影时,平移看起来很好。但是,当有两个独立的视图分别移动到相同位置时,有时会出现小的不对齐。 - Chris
3个回答

3
你的思路不对。用你自己的话说,“所有视图的背后”才是答案。
你已经注意到,将阴影应用于每个视图会由于每个视图的z-index而产生重叠的阴影。
你提到了为每个框创建一个附加视图,这是一个接近但不完全正确的解决方案。你可以创建一个单独的容器视图,并将所有框放在这个容器视图中。然后将阴影应用于容器视图。这将给你你想要的结果,但性能非常糟糕!每次调用layoutSubviews,例如当视图的frame发生更改时,阴影都会被重新计算。正如你所提到的,你正在使用pan手势,因此稍微移动一个框就会使子视图布局几十次。
你应该采用的解决方案是创建两个兄弟容器视图。对于每个彩色视图,将其添加到顶部容器视图中,并创建另一个视图,将其添加到底部容器视图中,我们称之为阴影容器视图。在阴影容器内部的视图上使用约束,使它们的顶部、前导、底部和尾随与顶部容器视图中的相应视图相等。接下来,在阴影容器视图内部的视图上添加阴影,并确保应用layer.shadowPath!这个阴影路径是防止拖动时重新绘制阴影的关键。
如果你不理解并需要一个示例,请让我知道,我可以给你一个。

1
使用 Autolayout 把 ShadowView 粘在另一个 View 上是个好主意。我也接受了你关于阴影性能的建议。非常感谢!现在运行得非常完美! - Chris
太好了!这对我有用。我希望UIView上有一些属性,可以防止其产生阴影绘制。这是一个丑陋的黑科技。 - Siamaster

0

嘿,Chris,试试这个

yourView.layer.shadowColor = UIColor(white: 0.0, alpha: 0.5).CGColor
yourView.layer.shadowOffset = CGSizeMake(0.0, 0.0)
yourView.layer.shadowOpacity = 1.0
yourView.layer.shadowRadius = 6.0 //increase the width & height of shadow

谢谢您的快速回答。但我仍然需要一种方法来将所有盒子的阴影放在所有盒子的后面。这个截图是从我的应用程序中获取的,因此在单个视图上创建阴影本身是可以的。但是,如何裁剪阴影以防止它出现在其他盒子上? - Chris
创建一个循环并向所有子视图添加阴影和拖动手势,创建一个公共函数来处理拖动手势事件,并在该函数中通过标签或其他方式检查视图类型。 - iOS Lifee
这就是我的做法。但是,阴影也会落在其他视图上:https://i.stack.imgur.com/xv1hX.png -- 我需要实现的是将阴影投射到所有视图的后面。 - Chris

0
你可以先添加带有阴影的视图,然后再在它们之上添加实际视图。或者,在设置阴影后,尝试更改所有视图的层的zPosition

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接