如何在图层旋转或缩放时创建与 CALayer 边界完全匹配的 CGPath?

How to create a CGPath which exactly match a CALayer bounds when the layer rotate or scale?

我们有一个显示带有编辑信息的图像的 CALayer。例如旋转、缩放和平移。我想制作一个与层边界完全匹配的 CGPath。当层旋转时,我的路径也应该旋转并且它的四个角应该与 CALayer 的四个角匹配。 CGPath实际上是作为一个灰度蒙版来显示图像的裁剪区域。

我尝试了以下代码,但它不起作用。

    f = self.imageLayer.frame;
    t = self.imageLayer.affineTransform;
    CGPathAddRect(path, &t, f);

CALayer 有自己的 CGAffineTransform。所有编辑信息都通过 CGAffineTransform 应用。

任何提示将不胜感激,非常感谢。

如果我答对了你的问题,你可以使用 UIBezierPathusesEvenOddFillRule 来切割你的图像层边界,使可见屏幕的其余部分变暗。基本上你创建一个非常大的矩形路径(由于某些原因 CGRectInfinite 在这里不起作用)并切掉图像层周围的区域。诀窍是使用 kCAFillRuleEvenOdd 翻转内部和外部的内容。

类似的东西应该有用:

    let cutPath = UIBezierPath(roundedRect: imageLayer.bounds, cornerRadius: 0)

    let clipPath = UIBezierPath(rect: CGRectMake(-10e6, -10e6, 10e7, 10e7)) // CGRectInfinite isn't working here ?
    clipPath.appendPath(cutPath)
    clipPath.usesEvenOddFillRule = true

    let shape = CAShapeLayer()
    shape.contentsScale = UIScreen.mainScreen().scale
    shape.lineWidth = 2
    shape.fillColor = UIColor(red:0.1, green:0.1, blue:0.1, alpha:0.5).CGColor
    shape.fillRule = kCAFillRuleEvenOdd
    shape.strokeColor = UIColor.whiteColor().CGColor

    shape.path = clipPath.CGPath
    imageLayer.addSublayer(shape)

    // do a transformations here
    imageLayer.transform = CATransform3DMakeRotation(10.0, 1.0, 1.0, 0.8)

结果