FreeShadow - 绘制不规则阴影

  • FreeShadow 能做什么
    在 iOS 开发中, 绘制阴影是一件常规任务。但绝大多数时候,我们只能绘制规则形状但阴影,比如矩形。那么怎么才能绘制不规则图形的阴影呢? 你可以使用 FreeShadow。
    FreeShadow 可以创建通过 UIBezierPath 绘制的不规则几何图形甚至是位图的阴影。

  • 用法
    将 ShadowView.swift 拖到你的项目中。ShadowView 是一个协议,定义了 3 个属性:

    var shadow: NSShadow{ get set }
    var shadowPath: UIBezierPath { get set }
    var intrinsicSize: CGSize { get set }

首先,你需要在自己的 UIView 中实现这些属性:

@IBDesignable
class BundleShadowView: UIView, ShadowView { 
    lazy var shadow: NSShadow = { // 1
        let shadow = NSShadow()
        shadow.shadowColor = UIColor.lightGray
        shadow.shadowOffset = CGSize(width: 0, height: 0)
        shadow.shadowBlurRadius = 15
        return shadow
    }()
    lazy var shadowPath: UIBezierPath = { // 2
        let bezierPath = UIBezierPath()
        bezierPath.move(to: CGPoint(x: 146, y: 117.98))
        ... ...
        bezierPath.close()
        return bezierPath
    }()
    var intrinsicSize: CGSize = CGSize(width: 278, height: 401) // 3
  • 你必须定义一个 NSShadow 用来告诉 FreeShadow 如何绘制这个阴影,比如阴影的颜色、offset 和晕开半径。
  • 然后你还需要告诉 FreeShadow 阴影长什么样子,是什么形状,也就是一个 UIBesierPath。你可以手工编写代码,也可以使用工具,比如 PaintCode 去绘制这个 UIBezierPath。
  • intrinsicSize 是能够完整显示这个阴影的布局大小。
    接下来,你需要覆盖 draw(_ rect:) 方法了。幸运的是,你不需要在这个方法中编写任何模版式的代码,你只需要调用 ShadowView 的 drawShadow(rect) :
    override func draw(_ rect: CGRect) {
        drawShadow(rect)
    }

然后打开 storyboard。在你的 storyboard 中,拖入一个 UIImage 到 view controller,设置好布局约束。示例程序中使用的是一张瓶子和盒子的图片。我们用它来演示 FreeShadow 的使用。

FreeShadow - 绘制不规则阴影

然后拖入一个 UIView。修改 class 为 BundleShadowView。稍微等上几秒钟,Storyboard 会重绘画不,阴影将被显示:
FreeShadow - 绘制不规则阴影

将 BundleShadowView 拖动到 UIImage 的下方,以便使两者更加贴合,然后适当添加一些约束:
FreeShadow - 绘制不规则阴影
最后,别忘了在 viewDidLoad() 方法中加上这句:

view.insertSubview(bottleBottomShadowView, at: 0)

这使得阴影的位置置于图片之下。

Build & Run , Bingo!

上一篇:实验四 继承


下一篇:2021-07-07