ios iPhone -在UIView上绘制透明矩形以显示下方视图

pobjuy32  于 2023-02-06  发布在  iOS
关注(0)|答案(5)|浏览(178)

我目前有两个UIView:一个红色背景,另一个蓝色背景。2蓝色视图是红色视图的子视图。3我想做的是能够在蓝色视图上“剪切”出矩形,这样红色视图就可以看到了。4你是怎么做的呢?

qybjjes1

qybjjes11#

你必须重写顶视图的drawRect方法。例如,你可以创建一个HoleyView类,它派生自UIView(你可以通过添加一个新文件到你的项目中,选择Objective-C子类,并将“Subclass of”设置为UIView)。在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 );
}

如果你使用的是Interface Builder,请确保将holey视图的类更改为HoleyView。你可以通过在Interface Builder的视图中选择并在检查器中选择“Identity”窗格(最右边的“i”图标)来完成。
您还必须使用以下代码片段将顶视图设置为非不透明,或者通过取消选中“界面构建器”中视图属性中的Opaque复选框(您将在视图属性的“视图”部分中找到它),并将其背景色的不透明度设置为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 );
    }
}
iszxjhcz

iszxjhcz2#

所有其他的答案都是正确的,但是很可能用清晰的颜色绘制,或者说 * 擦除 * 任何路径中的现有颜色,即使使用-[UIBezierPath fill]或类似的方便方法。您所要做的就是根据您试图实现的效果将上下文混合模式设置为一个适当的值,如下所示:

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

有大约24个不同的选项可以选择,看看CGContext参考。

vulvrdjw

vulvrdjw3#

要绘制椭圆而不是矩形,只需将blendMode设置为clear:

- (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 );
}
hpxqektj

hpxqektj4#

这些可能是愚蠢的方式,但我不会做你描述的方式,但使它看起来像你想要的样子。
(雅克的答案刚刚弹出来--在我看来不错)
方法1:在视图控制器中建立一个矩形列表,在暴露的"洞"周围平铺。随着你的洞数量的增加,平铺矩形的数量也会增加。
方法二:反过来想。蓝色视图应该在后面,红色视图的一部分放在上面。你仍然看到红色视图,除了蓝色视图掩盖的"洞"之外,所有的东西都被红色视图掩盖了。但是你真正做的是从你想曝光的视图中复制区域,并在你制作每个孔时把它们放在蒙版的顶部。如果你有一些模拟深度的效果,你可以根据需要为每个洞添加。
两者都不需要子类化或drawRect:。

6rvt4ljy

6rvt4ljy5#

有些答案相当古老。

2023年,最新技术包括...

class CompImage: UIIImageView {

     override func common() {
         super.common()
         layer.compositingFilter = "multiplyBlendMode"
         
         print("Filters available to you ...\n",
          CIFilter.filterNames(inCategory: kCICategoryCompositeOperation))
     }
 }

以及

guard let ctx = UIGraphicsGetCurrentContext() else { return }
ctx.saveGState()
ctx.setStrokeColor(
..
ctx.setBlendMode(.multiply) // review the choices available
..

相关问题