2015-06-19 35 views
7

的UIView我有削波使用CAShapeLayer-UIBezierPath,我要裁剪的內容,但我最終得到一個衝程(幀)與UIBezierPath的視圖的一個問題,這是我的代碼夾掩蔽與CAShapeLayer和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://i.stack.imgur.com/aehdo.png

不過,我想使邊界綠色,由中風裁剪

+0

您想要顯示貝塞爾路徑內部圖像的唯一部分。對? – Rajesh

+0

是的。 @RajeshMaurya – Aproram

+0

我可以知道嗎?你在哪寫代碼?在Viewcontroller或創建的UIView子類。 – Rajesh

回答

13

as rob mayoff said 您可以通過將視圖的圖層蒙版設置爲CAShapeLayer來輕鬆完成此操作。

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

在斯威夫特

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

謝謝答案傢伙。

萬一有人找不到合適的答案上因此,對於這個問題了幾個小時,像我剛纔那樣,我已經組建了一個工作要點中雨燕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) 

希望這將在未來一段時間內救一個人:)