¿Cómo get la intersección de dos CGPath?

Estoy usando CAShapeLayer.path y CALayer.mask para configurar la máscara de image, puedo lograr el "set de diferencias" y el efecto "unión" para CGPath configurando

 maskLayer.fillRule = kCAFillRuleEvenOdd/kCAFillRuleZero 

Sin embargo, ¿cómo puedo get la intersección de dos paths? No puedo lograrlo con reglas pares-impares

Aquí hay un ejemplo: introduzca la descripción de la imagen aquí

 let view = UIImageView(frame: CGRectMake(0, 0, 400, 400)) view.image = UIImage(named: "scene.jpg") let maskLayer = CAShapeLayer() let maskPath = CGPathCreateMutable() CGPathAddEllipseInRect(maskPath, nil, CGRectOffset(CGRectInset(view.bounds, 50, 50), 50, 0)) CGPathAddEllipseInRect(maskPath, nil, CGRectOffset(CGRectInset(view.bounds, 50, 50), -50, 0)) maskLayer.path = maskPath maskLayer.fillRule = kCAFillRuleEvenOdd maskLayer.path = maskPath view.layer.mask = maskLayer 

¿Cómo puedo hacer que se muestre la parte media de la misma? Es decir, solo la parte central (que está en blanco en la Vista de muestra).

Puedo hacerlo fácilmente en software de layout vectorial como AI, así que creo que debe haber una forma de manejarlo.

 extension UIImage { func doubleCircleMask(#circleSize:CGFloat)-> UIImage { let rectangle = CGRectMake(0, 0, size.width, size.height) UIGraphicsBeginImageContext(size) let x = size.width/2-circleSize/2 let y = size.height/2-circleSize/2 let offset = circleSize/4 let shape1 = UIBezierPath(roundedRect: CGRectMake(x-offset, y, circleSize, circleSize), cornerRadius: circleSize/2) shape1.appendPath(UIBezierPath(roundedRect: CGRectMake(x+offset, y, circleSize, circleSize), cornerRadius: circleSize/2)) shape1.addClip() drawInRect(rectangle) let result = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return result } func doubleCircleIntersectionMask(#circleSize:CGFloat)-> UIImage { let rectangle = CGRectMake(0, 0, size.width, size.height) UIGraphicsBeginImageContext(size) let x = size.width/2-circleSize/2 let y = size.height/2-circleSize/2 let offset = circleSize/4 let shape1 = UIBezierPath(roundedRect: CGRectMake(x-offset, y, circleSize, circleSize), cornerRadius: circleSize/2) let shape2 = UIBezierPath(roundedRect: CGRectMake(x+offset, y, circleSize, circleSize), cornerRadius: circleSize/2) shape1.addClip() shape2.addClip() drawInRect(rectangle) let result = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return result } } 

Pruebas

 let myPicture = UIImage(data: NSData(contentsOfURL: NSURL(string: "http://i.stack.imgur.com/Xs4RX.jpg")!)!)! let myPictureUnion = myPicture.doubleCircleMask(circleSize: 300) let myPictureIntersection = myPicture.doubleCircleIntersectionMask(circleSize: 300) 

introduzca la descripción de la imagen aquí