特殊阴影:Swift 2

Special drop shadow: Swift 2

在下图中,我有两种类型的阴影。

在swift中,我用过这个函数:

func applyShadow(view: UIView){
    view.layer.shadowColor = UIColor.blackColor().CGColor
    view.layer.shadowOffset = CGSizeMake(0, 1)
    view.layer.shadowOpacity = 0.5
    view.layer.shadowRadius = 10.0
    view.clipsToBounds = false
    view.layer.masksToBounds = false
}

将阴影应用于图像视图中的图像。

如何修改 applyShadow 函数使 iOS 投影与网页效果相匹配?

我正在使用 .png 文件,但如果我必须转换文件格式,那就不会太麻烦了。

像这样的东西应该可以工作:

func applyShadow(view: UIView){
    let offset = CGSize(width: 150, height: 150)
    let path = UIBezierPath()
    path.move(to: CGPoint(x: 0, y: 0))
    path.addLine(to: CGPoint(x: view.frame.size.width, y: 0))
    path.addLine(to: CGPoint(x: view.frame.size.width + offset.width, y: view.frame.size.height))
    path.addLine(to: CGPoint(x: view.frame.size.width + offset.width, y: view.frame.size.height + offset.height))
    path.addLine(to: CGPoint(x: view.frame.size.width, y: view.frame.size.height + offset.height))
    path.addLine(to: CGPoint(x: 0, y: view.frame.size.height))
    path.addLine(to: CGPoint(x: 0, y: 0))

    view.layer.shadowColor = UIColor.black.cgColor
    view.layer.shadowPath = path.cgPath
    view.layer.shadowOpacity = 0.2
    view.layer.shadowRadius = 2.0
    view.layer.masksToBounds = false
}

您可能需要 fiddle 与 offsetshadowOpacityshadowRadius 多一点才能尽可能接近,但这些值非常好当我在本地调试时关闭。

此外,您不需要同时执行 view.clipsToBoundsview.layer.masksToBounds。这些几乎可以互换,如果你设置了一个,另一个应该会自动更新。

这里就把view.layer.shadowOffset当做二维坐标系的第四象限。因此,如果该值为 CGSizeMake(0, 0),则阴影将均匀分布在所有边上。

现在view.layer.shadowRadius就是阴影的半径或范围。通过改变它的值,阴影长度会改变。

view.layer.shadowOpacity会改变阴影的暗度。它的值从 0 变为 1。

假设我们将 shadowOffset 设置为 CGSizeMake(5, 0) 并将 shadowRadius 设置为小于 5,则阴影将移动到物体的右侧,其他侧面不会有任何阴影。假设值为CGSizeMake(0, 5),阴影会在物体的底部,即向下移动5个点,其他边不会有阴影。因此,如果值为 CGSizeMake(5, 5),阴影将向左下方向移动 5 个点。

我想你对此有了更好的理解。所以当回到你的问题时,我认为这会起作用:

func applyShadow(view: UIView){
    view.layer.shadowColor = UIColor.blackColor().CGColor
    view.layer.shadowOffset = CGSizeMake(8, 12)
    view.layer.shadowOpacity = 0.4
    view.layer.shadowRadius = 5.0
}