如何在图层旋转或缩放时创建与 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 应用。
任何提示将不胜感激,非常感谢。
如果我答对了你的问题,你可以使用 UIBezierPath
的 usesEvenOddFillRule
来切割你的图像层边界,使可见屏幕的其余部分变暗。基本上你创建一个非常大的矩形路径(由于某些原因 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)
结果
我们有一个显示带有编辑信息的图像的 CALayer。例如旋转、缩放和平移。我想制作一个与层边界完全匹配的 CGPath。当层旋转时,我的路径也应该旋转并且它的四个角应该与 CALayer 的四个角匹配。 CGPath实际上是作为一个灰度蒙版来显示图像的裁剪区域。
我尝试了以下代码,但它不起作用。
f = self.imageLayer.frame;
t = self.imageLayer.affineTransform;
CGPathAddRect(path, &t, f);
CALayer 有自己的 CGAffineTransform。所有编辑信息都通过 CGAffineTransform 应用。
任何提示将不胜感激,非常感谢。
如果我答对了你的问题,你可以使用 UIBezierPath
的 usesEvenOddFillRule
来切割你的图像层边界,使可见屏幕的其余部分变暗。基本上你创建一个非常大的矩形路径(由于某些原因 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)
结果