一尘不染

Swift-在阴影层上切孔

swift

我想在UIView的阴影层中“切出一个洞”,Swift3,iOS

我有一个容器(UIView),有2个子容器:

  • 一个UIImageView
  • 该图像上方有一个UIView(“叠加层”)

我想给覆盖了一层阴影,并切出阴影的内矩形,创建一个辉光像在ImageView的边缘效果
,这是至关重要的辉光插图,由于图像拍摄屏幕宽度
我的代码至今:

let glowView = UIView(frame: CGRect(x: 0, y: 0, width: imageWidth, height: imageHeight))
glowView.layer.shadowPath = UIBezierPath(roundedRect: container.bounds, cornerRadius: 4.0).cgPath
glowView.layer.shouldRasterize = true
glowView.layer.rasterizationScale = UIScreen.main.scale
glowView.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
glowView.layer.shadowOpacity = 0.4

container.addSubview(imageView)
container.addSubview(glowView)

现在的结果如下所示:

图片

现在,我想剪掉较暗的内部部分,以便仅保留边缘的阴影。
知道如何实现这一点吗?


阅读 295

收藏
2020-07-07

共1个答案

一尘不染

幸运的是,今天(2020年)现在非常容易

这些天来很容易做到这一点:

在此处输入图片说明

这就是全部

import UIKit
class GlowBox: UIView {

    override func layoutSubviews() {
        super.layoutSubviews()

        backgroundColor = .clear
        layer.shadowOpacity = 1
        layer.shadowColor = UIColor.red.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 0)
        layer.shadowRadius = 3

        let p = UIBezierPath(
             roundedRect: bounds.insetBy(dx: 0, dy: 0),
             cornerRadius: 4)
        let hole = UIBezierPath(
             roundedRect: bounds.insetBy(dx: 2, dy: 2),
             cornerRadius: 3)
             .reversing()
        p.append(hole)
        layer.shadowPath = p.cgPath
    }
}

一个非常方便的提示:

当您添加(即 .append)两个类似的贝塞尔曲线路径时…

第二个必须是“正常”或“反转”。

请注意结尾处的代码行:

             .reversing()

像大多数程序员一样,如果在不同情况下应该是“正常”或“逆向” , 我将永远无法记住

简单的解决方案…

很简单,两者都尝试!

只需在有或没有的情况下尝试 .reversing()

它将以一种或另一种方式工作!:)

2020-07-07