2015-06-19 2 views
7

У меня есть проблема вырезки вида с помощью CAShapeLayer-UIBezierPath, я хочу, чтобы обрезать содержимое, но я в конечном итоге получить инсульт (рамка) с этим UIBezierPath, Это мой кодклип маскирующего UIView с 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

как 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 
2

Спасибо за ответы, ребята.

В случае, если кто-то не может найти подходящий ответ на SO на этот вопрос в течение нескольких часов, как я только что сделал, я уже собрал рабочую суть в 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) 

Надеется, что это сэкономит кому-то какое-то время в будущем :)

 Смежные вопросы

  • Нет связанных вопросов^_^