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

时间:2015-05-19 07:40:49

标签: ios calayer cgpath

我们有一个CALayer,可以显示包含编辑信息的图像。如旋转,缩放和平移。我想制作一个与图层边界完全匹配的CGPath。当图层旋转时,我的路径也应该旋转,其四个角应该与CALayer的四个角相匹配。 CGPath实际上用作灰色遮罩,以显示图像的剪切区域。

我尝试使用代码,但它不起作用。

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

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

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

1 个答案:

答案 0 :(得分:0)

如果我的问题正确,您可以使用UIBezierPath的{​​{3}}剪切图像图层边界,使可见屏幕的其余部分变暗。基本上你创建一个非常大的矩形路径(由于某些原因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)

结果

enter image description here