iPhone – Dibuja un rectángulo transparente en UIView para revelar la vista debajo

Actualmente tengo dos UIViews: uno de fondo rojo y el otro azul. La vista azul es una subvista de la vista roja. Lo que me gustaría hacer es poder “cortar” rectangularjs en la vista azul para que la vista roja pueda ser visible. ¿Cómo haces esto?

Tienes que anular el método drawRect la vista superior. Entonces, por ejemplo, puede crear una clase HoleyView que se deriva de UIView (puede hacerlo agregando un nuevo archivo a su proyecto, seleccionando la subclase Objective-C y estableciendo “Subclase de” en UIView ). En HoleyView , drawRect se vería así:

 - (void)drawRect:(CGRect)rect { // Start by filling the area with the blue color [[UIColor blueColor] setFill]; UIRectFill( rect ); // Assume that there's an ivar somewhere called holeRect of type CGRect // We could just fill holeRect, but it's more efficient to only fill the // area we're being asked to draw. CGRect holeRectIntersection = CGRectIntersection( holeRect, rect ); [[UIColor clearColor] setFill]; UIRectFill( holeRectIntersection ); } 

Si está utilizando el constructor de interfaces, asegúrese de cambiar la clase de la vista holey a HoleyView . Puede hacerlo seleccionando en la vista en Interface Builder y seleccionando el panel “Identity” en el inspector (es el que está en el extremo derecho el ícono “i”).

También debe configurar la vista superior para que no sea opaca con el siguiente fragmento de código o al Opaque checkbox Opaque en las propiedades de la vista en el Creador de interfaz (lo encontrará en la sección Vista de los atributos de la vista) y establecer la opacidad del color de fondo en 0% (el color de fondo se establece en la misma sección).

 topView.opaque = NO; topView.backgroundColor = [UIColor clearColor]; 

Si quieres hacer círculos, debes usar Core Graphics (también conocido como Quartz 2D). Probablemente quiera leer la guía de progtwigción, que está disponible aquí .

Para dibujar una elipse en lugar del rectángulo, su drawRect se vería así:

 - (void)drawRect:(CGRect)rect { // Get the current graphics context CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor( context, [UIColor blueColor].CGColor ); CGContextFillRect( context, rect ); if( CGRectIntersectsRect( holeRect, rect ) ) { CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor ); CGContextFillEllipseInRect( context, holeRect ); } } 

Hay una verdad en todas las demás respuestas, pero es muy posible dibujar con un color claro , o sea, borrar los colores existentes en cualquier ruta, incluso con el método – [UIBezierPath fill] o métodos de conveniencia similares. Todo lo que tiene que hacer es establecer el modo de fusión de contexto en un valor apropiado dependiendo del efecto que esté tratando de lograr, así:

 CGContextSetBlendMode(context, kCGBlendModeClear); [[UIColor clearColor] set]; [myArbitraryPolygonPath fill]; 

Hay alrededor de dos docenas de opciones diferentes que puede elegir, eche un vistazo a la referencia de CGContext .

para dibujar una elipse, en lugar de rect, simplemente configure blendMode para borrar:

 - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor( context, [UIColor blackColor].CGColor ); CGContextFillRect( context, rect ); CGRect holeRectIntersection = CGRectIntersection( holeRect, rect ); CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor ); CGContextSetBlendMode(context, kCGBlendModeClear); CGContextFillEllipseInRect( context, holeRect ); } 

Estas pueden ser las maneras tontas, pero yo no lo haría de la manera que describes, pero haz que se vea como quieres que se vea.

(La respuesta de Jacques acaba de aparecer, me queda bien)

Enfoque 1: en el controlador de vista para crear una lista de rectangularjs que se superponen alrededor del “agujero” expuesto. A medida que aumentan sus agujeros en número, también boostá la cantidad de rectas en mosaico.

Enfoque 2: invierta su forma de pensar. La vista azul debe estar en la parte posterior con secciones de la vista roja colocadas encima. Todavía se ve una vista roja con todos los “agujeros” enmascarados por la vista azul, pero lo que realmente está haciendo es copiar regiones de la vista que desea exponer y ponerlas encima de la máscara a medida que hace cada agujero. Si tiene algún efecto que simule profundidad, puede agregarlo según sea necesario en cada hoyo.

Ninguno de los dos requiere subclassing o drawRect :.