如何在 iOS 中与 CAShapeLayers 相交

How to intersect CAShapeLayers in iOS

我有一个加号 (+) 当前颜色为蓝色,但我想让它透明以便用户可以看到背景。加层被添加到更大的视图中。将plus层设置为clear颜色并不能解决问题

class AddButtonView: UIView {
    ...

    private func setupPlusLayer() {
        let path = UIBezierPath()
        path.move(to: CGPoint(x: plusButton.frame.midX, y: plusButton.frame.midY-20))
        path.addLine(to: CGPoint(x: plusButton.frame.midX, y: plusButton.frame.midY+20))
        path.move(to: CGPoint(x: plusButton.frame.midX-20, y: plusButton.frame.midY))
        path.addLine(to: CGPoint(x: plusButton.frame.midX+20, y: plusButton.frame.midY))
        path.usesEvenOddFillRule = true

        let shapeLayer = CAShapeLayer()
        shapeLayer.fillRule = .evenOdd
        shapeLayer.path = path.cgPath
        shapeLayer.strokeColor = UIColor.blue.cgColor
        shapeLayer.fillColor = UIColor.blue.cgColor
        shapeLayer.lineWidth = 4

        // Add that `CAShapeLayer` to your view's layer:
        self.layer.addSublayer(shapeLayer)
    }
}

如何使加号透明?

尝试使用带有 + 的 .png 图像透明它会工作正常,您将不需要绘制加号。

您可以通过以下方式实现:

  1. 创建圈子 CAShapeLayer (circleShape);
  2. 创建与 circleShape 颜色相同的反转遮罩层 (inverted)。对于这种情况,您需要 CGMutablePath 具有完全相同的圆形路径和加号路径。另外,不要忘记设置 inverted.fillRule = .evenOdd;
  3. 比你需要一个只有透明加号的图层 (plusShape);
  4. 添加 circleShape 作为视图图层的子图层;
  5. 设置掩码:circleShape.mask = inverted
  6. 添加 plusShape 作为视图图层的子图层。

就是这样!现在你有透明加唱歌。示例: