Quartz2D: ¿Cómo convertir un recorte rectángulo a una máscara invertida en time de ejecución?

Dado:

  1. un CGContextRef ( ctx ) con el marco {0,0,100,100}
  2. y un rect ( r ), con marco {25,25,50,50}

Es fácil recortar el context a ese rect:

 CGContextClipToRect(ctx, r); 

para enmascarar el área roja a continuación (máscara roja ==) :

introduzca la descripción de la imagen aquí

Pero quiero invertir este recorte rectángulo para convertirlo en una máscara de recorte. El resultado deseado es enmascarar la parte roja de abajo (máscara roja ==) :

introduzca la descripción de la imagen aquí

Quiero hacer esto programáticamente en time de ejecución.

No quiero preparar manualmente una image de bitmap para enviar estáticamente con mi aplicación.

Dado ctx r , ¿cómo se puede hacer esto en time de ejecución de la forma más fácil / directa?

Lea acerca de las reglas de relleno en la sección " Rellenar un path" de la Guía de progtwigción de Quartz 2D .

En su caso, lo más fácil es usar la regla de relleno pares. Cree una ruta que consista en su pequeño rectángulo y un rectángulo mucho más grande:

 CGContextBeginPath(ctx); CGContextAddRect(ctx, CGRectMake(25,25,50,50)); CGContextAddRect(ctx, CGRectInfinite); 

Luego, cruza esta ruta en la ruta de recorte utilizando la regla de relleno pares:

 CGContextEOClip(ctx); 

Podría recortar el context con CGContextClipToRects() pasando los rectos que conforman el marco rojo que ha deseado.

¿Puede simplemente hacer toda su pintura de manera normal y luego hacer lo siguiente:

 CGContextClearRect(ctx, r); 

¿Después de todo se ha hecho?