在iOS中绘制半透明矩形

5

我曾长时间寻找答案,也试图自己解决问题,但无济于事。我认为这里是提问的最佳地点。我试图实现简单的功能,但却找不到方法。我觉得我在概念层面上遗漏了一些东西。以下是我尝试在子类化UIView的class中创建半透明矩形的方式:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    //this should be white color with 0.7 opacity right
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.7);
    CGContextFillRect(context, self.bounds);
}

好的,这只是使颜色变成灰色。我也尝试了以下方法,但结果相同: CGContextSetRGBFillColor(context,1.0,1.0,1.0,1.0); CGContextSetAlpha(context,0.7);

另一种尝试:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(context, self.bounds);

    self.alpha = 0.7;
}

看,我解决了。但并不完全是这样。我想在上下文中画一个半透明的矩形,而不是使整个视图透明。然后,例如添加另一个完全不透明的矩形。很想听听你的想法。谢谢。

2个回答

5

我猜你看不到矩形的透明度是因为视图中有背景色。

请尝试按照以下方式设置视图的背景颜色:

self.backgroundColor = [UIColor clearColor];

顺便提一下,任何设置自定义视图属性的语句(例如self.alpha = 0.7;)都应该放在init方法中。

编辑:

正如@borrrden所指出的那样,可能需要设置的真正属性是opaque。按照苹果文档的说法,通常将其设置为YES,这意味着以下内容:

不透明视图应填充其边界以完全不透明的内容,即内容的alpha值应为1.0。如果视图是不透明的,并且未填充其边界或包含完全或部分透明的内容,则结果是不可预测的。如果视图完全或部分透明,您应始终将此属性的值设置为NO。

将背景颜色设置为clearColor很可能会作为副作用将此属性的值设置为NO

编辑:

我不明白为什么要在自定义UIView中覆盖drawRect来绘制半透明矩形,也许是因为我不知道您想做什么。在任何情况下,您可能想要尝试的另一种方法是使用嵌套的UIViews或嵌套的CALayers,在其中分配不同的alpha/opacity值。

如果您只对具有不同透明度程度的矩形感兴趣,则可以将它们嵌套在父视图中,并为每个矩形分配半透明的背景颜色。


1
我打赌这个代码之所以能够运行,是因为opaque属性被设置为YES,这会忽略透明度。将背景颜色设置为带有透明度的颜色会隐式地将该值设置为NO并允许透明度。 - borrrden
哇,太棒了,这个解决了,谢谢!我不是很明白。我知道'clearColor'在做什么,但为什么我们要使用它呢?我的意思是文档说UIView的默认backgroundColor是nil,也就是透明。但是从这里的实验中我看到的是默认的背景颜色实际上是黑色,这导致了灰色。如果我错了,请证明给我看。 - Vasil Garov
在许多 WWDC 视频中都提到了性能方面的问题,即将视图的 alpha 值设置为某个值,或将背景颜色更改为带有 alpha 值的颜色,会在幕后为您设置不透明度值为“NO”(如果您遇到性能问题,则需要注意这一点),这就是为什么仅仅通过这种方式设置背景颜色就可以工作的原因。 - borrrden
@borrrden,现在我明白了。从性能角度来看,最好的方法是设置“self.opaque = NO;”吗? - Vasil Garov
@sergio,我本来想展示我正在尝试做的事情,但由于声望不够,无法上传图片。简单来说:我正在尝试创建一个类似预加载器的条形图,它会通过动画方式填充半透明背景,并用白色不透明填充物进行填充。因此,我认为最好的方法是使用嵌套的UIView,就像你所说的那样。再次感谢。 - Vasil Garov
显示剩余2条评论

2
您可以使用这个,
[[UIImage imageNamed:@"semiTransparentImage.png"] drawInRect:rect blendMode:kCGBlendModeDestinationOut alpha:1.0];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接