Swift - 在阴影层切孔

ska*_*esh 2 shadow calayer ios swift swift3

我想在 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)
Run Code Online (Sandbox Code Playgroud)

结果如下所示:

图片

现在我想剪掉较暗的内部部分,以便只保留边缘的阴影
任何想法如何实现?

Fat*_*tie 6

幸运的是,今天(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
    }
}
Run Code Online (Sandbox Code Playgroud)

一个非常方便的提示:

当您添加(即 .append)两条这样的贝塞尔曲线时...

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

请注意接近末尾的代码行:

             .reversing()
Run Code Online (Sandbox Code Playgroud)

像大多数程序员一样,我永远不会记得在不同情况下它应该是“正常”还是“逆向”!!

简单的解决方法...

很简单,两个都试试!

只需尝试使用和不使用 .reversing()

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