如何使用 drawRect 覆盖在 UIView 子类的某些区域中获得透明度

Posted

技术标签:

【中文标题】如何使用 drawRect 覆盖在 UIView 子类的某些区域中获得透明度【英文标题】:How to get transparency in certain areas of UIView subclass with drawRect override 【发布时间】:2013-04-29 20:29:32 【问题描述】:

我有一个 UIView 子类,其中 drawRect 被覆盖。绘图代码不会填满视图的整个区域;其中一些是透明的。但是当它在屏幕上绘制时,应该透明的是黑色。 我如何让它正确透明?

如果我将backgroundColor 设置为[UIColor clearColor],整个视图就会消失。如果我将其设置为任何其他颜色,黑色区域将变为该颜色。将opaque 设置为NO 具有相同的效果。如果我在drawRect 的开头绘制一个透明矩形,如下所示:

[[UIColor clearColor] setFill];
UIRectFill( rect );

...然后它又变黑了。我可以在上面的代码中使用另一种颜色,它会绘制那种颜色。如果我使我使用的颜色部分透明,我可以看到黑色透过。

更新: 我的视图可能具有透明度渐变。我尝试使用一个非常简单的UIView 子类进行测试,该子类只在其边界内绘制一个蓝色矩形,并使其他所有内容透明。将该视图设置为 opaque=NO 会按预期呈现。

【问题讨论】:

在你的drawRect中,你调用CGContextClearRect(context, rect);吗? @MattWilding:不。我尝试将clearsContextBeforeDrawing设置为yes,no设置为无效。 【参考方案1】:

视图的opaque 必须设置为NObackgroundColor 必须设置为[UIColor clearColor]。此外,使用了错误的混合模式。我们有:

CGContextSetBlendMode(context, kCGBlendModeSourceAtop);

我们需要:

CGContextSetBlendMode(context, kCGBlendModeDestinationOver);

绘图代码是由一个可以输出代码的图形工具生成的,他们的支持部门发现由于一个错误的错误而生成了错误的混合常数。

【讨论】:

【参考方案2】:

尝试使用这行代码来初始化您的视图。

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        [self setOpaque:NO];
        [self.layer setOpaque:NO];
    
    return self;

你可以设置 alpha 属性来制作透明效果

self.alpha=0.3f;

【讨论】:

我尝试将视图及其图层都设置为opaque=no。没有骰子。有关更多信息,请参阅我的更新:我的视图具有透明度渐变。

以上是关于如何使用 drawRect 覆盖在 UIView 子类的某些区域中获得透明度的主要内容,如果未能解决你的问题,请参考以下文章

UIView 内容模式在覆盖 drawRect 时表现不同:

如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景

在 drawRect 上添加覆盖图像

在我的自定义 UIView 中,设置子视图的 backgroundColor 会导致它覆盖我的 drawRect 绘图(CGContextRef、CGMutablePathRef 等)。怎么修?

即使使用 UIViewContentModeScaleAspectFill 也会调用自定义 UIView drawRect

如何在drawRect中获取UIView大小