正常的单阴影通过shadowColor设置即可,但是项目要做新拟态风格,大概就是三四个外阴影,加两三个内阴影。。。很蛋疼,最开始用图片做,但是图片带了阴影后拉伸会导致位置无法确认,并且拉伸后的阴影看上去很难看,最终走上了拿代码实现的道路。
实现的逻辑是三层view,底层容器view+(外阴影view+内阴影view),目前存在的问题是如果圆角不一致的无法使用,会把外阴影切掉,如果后续有了办法会更新,如果有大神大佬有相关的知识欢迎分享。非常感谢。
先说外阴影的实现:
首先是,外阴影本身有一种通过UIBezierPath实现的方法,之后发现通过UIBezierPath实现是一个大于view的视图在view底部,形成的阴影,并且是layer,那么我通过sublayer是否可以实现添加多个sublayer来实现。
因为需要适配,所有在layoutSubviews中调用
效果如上,看着很奇怪,因为这个是外阴影的单个view效果,现在我们需要上面加一层view,这样阴影效果就出来了,但是如果我直接吧view加在这个阴影view上面会发现没有效果,因为被sublayer遮盖了,所以需要在阴影view的同位置加在阴影view的superview上。这也是为什么要用三层view实现的原因。
加上个白色view在上面后的效果,现在看起来有点那么回事了。之后来研究内阴影,找到了一片关于内阴影的文章,实现了内阴影的效果
https://www.jianshu.com/p/b4d1a0b6439a,大佬是swift写的,我转成了oc的。
通过drawRect绘制内阴影,主要的逻辑是画一层内阴影之后再把中间抠出来绘制一层底色。(我理解的是这样的)
在drawRect中调用该方法绘制内阴影,效果如下
内外阴影整体效果
大概就是这么个情况,关于性能上的问题我也一直在考虑会不会很消耗性能,但是没有看出来有什么问题,而且目前也只有这种实现方法。如果有大佬可以更好的修正其中的问题,非常感谢指教。关于内外阴影的绘制肯定会有更精简的方法,但是实在是能力有限,目前只能这样。如果大佬有更好的实现办法,包括可以多角不同角度的方法,代码精简,性能优化欢迎指点。
下面把整体的代码放置,可能有点乱,但是应该不至于看不懂。
链接: https://pan.baidu.com/s/1Zq6TRoy4FaobGnTF1jVmXg?pwd=1234 提取码: 1234 复制这段内容后打开百度网盘手机App,操作更方便哦