在UIView上设置Alpha会在其子视图上设置Alpha,这不应发生


85

根据文档 UIVIew @property(nonatomic) CGFloat alpha

此属性的值是介于0.0到1.0之间的浮点数,其中0.0表示完全透明,而1.0表示完全不透明。 此值仅影响当前视图,并且不影响其任何嵌入式子视图。

我有一个配置如下的容器视图:

self.myView.backgroundColor = [UIColor blackColor];
self.myView.alpha = 0.5;
[self addSubview:self.myView];

然后将子视图添加到“ myView”

[myView addSubView anotherView];
anotherView.alpha = 1;
NSLog(@"anotherView alpha = %f",anotherView.alpha); // prints 1.0000 as expected

但是' anotherView '的确在屏幕上有Alpha(它并非如预期的那样不透明)

怎么可能?该怎么办?


也许添加子视图和设置Alpha的顺序很重要。尝试使用不同的音序。
约里德

添加所有创建anotherView的代码:),我也认为这是拼写错误,但是您确定要初始化self.myView吗?并添加anotherView诸如此类[self.self addSubview:self.myView];
iPatel

1
实际上,文档是正确的:不会影响其嵌入式子视图,并且子视图的Alpha始终相同-但是渲染的alpha视图的alpha值等于所有子视图的值相乘。例如,如果子视图的Alpha0.8和超级视图的Alpha是1.0,但将其更改为0.6,则子视图的Alpha仍然相同0.8。渲染的子视图的alpha值仅从更改0.80.48
Holex 2014年

Answers:


117

我认为这是文档中的错误。您应该将其提交到bugreport.apple.com。

经过一番快速研究,我所看到的一切都表明您所看到的是其始终的行为方式,而我自己的测试也表明了这一点。

视图的Alpha应用于所有子视图。

也许您所需要的只是,[[UIColor blackColor] colorWithAlphaComponent:0.5]但是如果没有,您将需要使视图成为同级而不是孩子。


21
+1。FWIW,我认为这些文档是非常正确的,即使非常不清楚(以至于在所有实际目的上都不正确)。子视图的Alpha会受到影响,但alpha值不会受到影响。我认为,对于隐藏属性,这是相同的行为。设置隐藏会隐藏子视图,但不会导致设置子视图的隐藏属性。
Bjorn Roche

2
我需要显示一个类似于uipopover的视图,但在iphone中。我必须使用[[UIColor blackColor] colorWithAlphaComponent:0.5]创建一个uiviewcontroller。感谢它的作用
Alok

2
我不认为这些文档“完全正确”。在现实世界中,开发人员将阅读文档,并认为孩子的alpha不会受到影响。实际上,当合成结果就像修改了alpha一样。这只是不良文档的一种情况。
2015年

43

不要直接在父视图上设置Alpha。代替使用下面的代码行,这将对父视图应用透明性而不影响其子视图。

[parentView setBackgroundColor:[[UIColor clearColor] colorWithAlphaComponent:0.5]];


此代码不适用于最新的ios和xcode。任何人有不同的想法?
Moxarth

1
优秀!!对于Swift 4,请使用:parentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
Rakesh Yembaram,2018年

很好的解决方案。
iLearner

27

迅速

view.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.5)

为SWIFT 3更新

view.backgroundColor = UIColor.white.withAlphaComponent(0.5)

2
这不能解决所问的问题。
大卫·贝瑞

这给我一个错误:“类型'UIColor'的值没有成员'colorWithAlphaComponent'”。
Krivvenz '16

1
您好@Krivvenz,“ colorWithAlphaComponent”已重命名为“ withAlphaComponent”。看到我编辑的答案。
Nazarii Stadnytskyi

此代码不起作用。我们看不到推送视图是透明的。有人有其他想法吗?
Moxarth

21

将背景色设置为“不透明度”而不是Alpha不会影响其子视图。

  1. 选择视图。
  2. 比背景色去属性检查器
  3. 点击“其他”
  4. 将不透明度设置为30%

或者您可以通过编程设置

var customView:UIView = UIView()
customView.layer.opacity = 0.3

而已。快乐编码!


有什么办法以编程方式执行此操作吗?
DCIndieDev

@DCIndieDev对不起,我还没有发现不透明作为UIView的属性。因此由情节提要设置。
MRizwan18年

这是一个很好的答案。很棒。
Joe Susnick

这应该是公认的答案,根据需要工作。谢谢。
弥撒

1
@ MRizwan33您可以从[您的UIView] .layer.opacity
Missa,

16

如果您喜欢情节提要,User Defined Runtime Attribute请在Identity Inspector

Key Path: backgroundColorType: ColorValue:例如白色与不透明度50%。


好答案!在“属性”检查器中,将视图的Alpha设置为1。在身份检查器中,我插入不透明度为50%的上​​述密钥路径。该视图的不透明度现在为50%,但是子视图的不透明度仍为100%。我想阿尔法和不透明度是不一样的。
etayluz '16

6

讨论的最简单的解决方案是按如下方式更改Alpha:Xcode 8 Swift 3的更新版本是:

yourParentView.backgroundColor = UIColor.black.withAlphaComponent(0.4)

目标C:

yourParentView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];

在此处引用Apple Developer Docs:https : //developer.apple.com/reference/uikit/uiview/1622417-alpha


是的,我应用了此方法,但是视图并没有变得透明。我已经多次使用此代码。但是这次它不起作用。并以纯黑色显示我的观点。那么任何替代方法还是随着新的iOS更新而改变了?
Moxarth

yourParentView后面的视图很可能必须是纯黑色的,请检查情节提要中的xib以及代码是否从其他任何地方设置为黑色。希望这会
有所

我只是从一种观点推开另一种观点。在此代码之后,推入的视图将显示为透明。我已经使用了很多次了。就这么简单。-> settings * set = [[settings alloc] initWithNibName:@“ settings” bundle:nil]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.3f]; -> [self.navigationController pushViewController:set动画:是];
Moxarth

您使用的是xib还是情节提要吗?
Ankit Kumar Gupta

但现在我正在使用此代码,并且无法正常工作。推入的视图将以单色显示,无论我们给定哪种颜色,都不透明。
Moxarth

4

在Swift 4.2和Xcode 10.1中

不要通过情节提要添加颜色和Alpha值。在这种情况下,只有程序方法才行。

transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)

@iOS谢谢你,这个帮助了我。
拉古拉姆

2

这是一个有点复杂的解决方案:

UIView *container;
UIView *myView;
UIView *anotherView;

myView.alpha = 0.5;
[container addSubview:myView];

anotherView.alpha = 1;
[container addSubview:anotherView];

container视图用作父视图,anotherView并且myView都是的子视图containeranotherView不是的子视图myView


2

目前,只有一种方法可以使父视图透明,并且不将任何子视图放在父视图内部(不要将任何视图作为子视图),而是将子视图放在父视图之外。要使父视图透明,可以通过情节提要进行此操作。

//Transparent the parentView

parentView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.8)

将另一个视图放在父视图之外。它将像魅力一样工作。


0

请参考Xcode文档中的粗体描述。

此属性的值是介于0.0到1.0之间的浮点数,其中0.0表示完全透明,而1.0表示完全不透明。更改此属性的值只会更新当前视图的alpha值。但是,该alpha值赋予的透明度会影响视图的所有内容,包括其子视图。例如,嵌入到父视图中且alpha值为0.5的alpha值为1.0的子视图出现在屏幕上,好像其alpha值也是0.5。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.