iPhone – 在UIView上绘制透明矩形,以显示下方的视图
我目前有两个UIViews:红色背景和其他蓝色之一。 蓝色视图是红色视图的子视图。 我想要做的是能够在蓝色视图上“剪切”矩形,以便红色视图可以被看到。 你怎么去做这个?
你必须重写顶视图的drawRect
方法。 所以,例如,你可以创build一个从UIView
派生的HoleyView
类(你可以通过向你的项目添加一个新文件,selectObjective-C的子类,并设置UIView
“Subclass of”来实现)。 在HoleyView
, drawRect
看起来像这样:
- (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 ); }
如果您使用的是界面构build器,请确保将多孔视图的类更改为HoleyView
。 你可以通过在界面生成器的视图中select并select检查器中的“标识”窗格(它在最右边的“我”图标)。
您还必须使用以下代码片段将顶视图设置为非透明,或者在Interface Builder的视图属性中取消选中Opaque
checkbox(您可以在视图的属性的视图部分find它)并将背景颜色的不透明度设置为0%(背景颜色设置在同一部分中)。
topView.opaque = NO; topView.backgroundColor = [UIColor clearColor];
如果你想做圆圈,你必须使用Core Graphics
(又名Quartz 2D)。 您可能需要阅读此处提供的编程指南。
要绘制一个椭圆而不是矩形,你的drawRect
看起来像这样:
- (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 ); } }
在所有其他答案中都是有道理的,但是使用清晰的颜色进行绘制是非常有可能的 ,甚至可以使用 – [UIBezierpath填充]或类似的方便方法来擦除任何path中的现有颜色。 您所要做的就是根据您要实现的效果将上下文混合模式设置为适当的值,如下所示:
CGContextSetBlendMode(context, kCGBlendModeClear); [[UIColor clearColor] set]; [myArbitraryPolygonPath fill];
有大约二十个不同的选项可供select,请参考CGContext参考 。
绘制一个椭圆,而不是一个矩形,只需设置blendMode清除:
- (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 ); }
这些可能是愚蠢的方式,但我不会按照你描述的方式去做,而是让它看起来像你想要的样子。
(雅克的答案刚刚popup – 看起来不错,我)
方法1:在视图控制器中build立一个矩形的列表,这个矩形是围绕着暴露的“洞”。 随着洞数的增加,瓷砖的数量也会增加。
方法2:扭转思维。 蓝色的视图应该放在后面,红色的视图部分放在它的顶部。 你仍然可以看到一个除了被蓝色视图掩盖的“洞”之外的红色视图,但是你真正在做的是从你想要曝光的视图中复制区域,并且在你制作每个洞的时候把它们放在掩码的顶部。 如果你有一些模拟深度的效果,你可以根据需要添加每个孔。
既不需要子类化或drawRect :.