ios uiview core-graphics drawrect masking

Máscara de inversión de iOS en drawRect



uiview core-graphics (4)

Con el código siguiente, estoy enmascarando con éxito parte de mi dibujo, pero es lo inverso de lo que quiero enmascarado. Esto enmascara la parte interior del dibujo, donde me gustaría enmascarar la parte exterior. ¿Hay una forma sencilla de invertir esta máscara?

myPath continuación es un UIBezierPath .

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; CGMutablePathRef maskPath = CGPathCreateMutable(); CGPathAddPath(maskPath, nil, myPath.CGPath); [maskLayer setPath:maskPath]; CGPathRelease(maskPath); self.layer.mask = maskLayer;


Basado en la respuesta aceptada, aquí hay otro mashup en Swift. Lo he hecho en una función y he hecho la invert opcional.

class func mask(viewToMask: UIView, maskRect: CGRect, invert: Bool = false) { let maskLayer = CAShapeLayer() let path = CGPathCreateMutable() if (invert) { CGPathAddRect(path, nil, viewToMask.bounds) } CGPathAddRect(path, nil, maskRect) maskLayer.path = path if (invert) { maskLayer.fillRule = kCAFillRuleEvenOdd } // Set the mask of the view. viewToMask.layer.mask = maskLayer; }


Incluso con un relleno extraño en la capa de forma ( maskLayer.fillRule = kCAFillRuleEvenOdd; ) puede agregar un gran rectángulo que cubra todo el marco y luego agregar la forma que está ocultando. En efecto, esto invertirá la máscara.

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; CGMutablePathRef maskPath = CGPathCreateMutable(); CGPathAddRect(maskPath, NULL, someBigRectangle); // this line is new CGPathAddPath(maskPath, nil, myPath.CGPath); [maskLayer setPath:maskPath]; maskLayer.fillRule = kCAFillRuleEvenOdd; // this line is new CGPathRelease(maskPath); self.layer.mask = maskLayer;


Para Swift 3.0

func mask(viewToMask: UIView, maskRect: CGRect, invert: Bool = false) { let maskLayer = CAShapeLayer() let path = CGMutablePath() if (invert) { path.addRect(viewToMask.bounds) } path.addRect(maskRect) maskLayer.path = path if (invert) { maskLayer.fillRule = kCAFillRuleEvenOdd } // Set the mask of the view. viewToMask.layer.mask = maskLayer; }


Para Swift 4.2

func mask(viewToMask: UIView, maskRect: CGRect, invert: Bool = false) { let maskLayer = CAShapeLayer() let path = CGMutablePath() if (invert) { path.addRect(viewToMask.bounds) } path.addRect(maskRect) maskLayer.path = path if (invert) { maskLayer.fillRule = .evenOdd } // Set the mask of the view. viewToMask.layer.mask = maskLayer; }