【问题标题】:Setting alpha on UIView sets the alpha on its subviews which should not happen在 UIView 上设置 alpha 会在其子视图上设置不应该发生的 alpha
【发布时间】:2013-09-11 23:28:23
【问题描述】:

根据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];
  • 确实,文档是正确的:这不会影响 其嵌入的子视图,并且子视图的 alpha 始终相同——但呈现的视图有一个 alpha值是所有子视图的 alpha 值,相乘。例如如果 subviews alpha 0.8 和 superview 的 alpha 是 1.0,但是你把它改成 0.6,subviews alpha 还是一样的,0.8。渲染的子视图的 alpha 值仅从 0.8 更改为 0.48

标签: ios objective-c cocoa-touch uiview alpha-transparency


【解决方案1】:

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

经过一些快速研究后,我所看到的一切表明您所看到的是它一直以来的表现,我自己的测试也表明了这一点。

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

也许您只需要[[UIColor blackColor] colorWithAlphaComponent:0.5],但如果不是,您需要将视图设为兄弟而不是子视图。

【讨论】:

  • +1。 FWIW,我认为这些文档可以说是正确的,如果非常不清楚(以至于对于所有实际目的都不正确)。子视图的 alpha 受到影响,但不影响 alpha 值。我认为,对于隐藏的属性,这是相同的行为。设置 hidden 隐藏子视图,但不会导致设置子视图隐藏属性。
  • 我需要显示类似 uipopover 之类的视图,但在 iphone 中。我必须使用 [[UIColor blackColor] colorWithAlphaComponent:0.5] 创建一个 uiviewcontroller。谢谢它有效
  • 我根本不相信这些文档是“可以说是正确的”。在现实世界中,开发人员会阅读文档并相信子 alpha 不会受到影响。实际上,合成结果就像 alpha 已被修改一样。这只是一个糟糕的文档。
【解决方案2】:

不要直接在父视图上设置 alpha。而不是使用下面的代码行,它将透明度应用于父视图而不影响其子视图。

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

【讨论】:

  • 此代码不适用于最新的 ios 和 xcode 。有人有不同的想法吗?
  • 太棒了!!对于 swift 4 使用: parentView.backgroundColor=UIColor.black.withAlphaComponent(0.5)
  • 很好的解决方案。
【解决方案3】:

如果您喜欢 Storyboards,请在 Identity Inspector 中添加 User Defined Runtime Attribute 以供您查看:

Key Path: backgroundColor, Type: Color, Value: 例如白色,不透明度 50 %。

【讨论】:

  • 很好的答案!在属性检查器中,我将视图的 alpha 设置为 1。在 Identity Inspector 中,我插入上面的关键路径,不透明度为 50%。视图的不透明度现在为 50%,但子视图的不透明度仍为 100%。我想 alpha 和 opacity 不是一回事。
【解决方案4】:

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

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

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

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

使用container 视图作为父视图,anotherViewmyView 都是container 中的子视图,anotherView 不是myView 中的子视图。

【讨论】:

    【解决方案5】:

    迅速

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

    为 SWIFT 3 更新

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

    【讨论】:

    • 这并没有解决所提出的问题。
    • 这给了我一个错误:“'UIColor' 类型的值没有成员 'colorWithAlphaComponent'”。
    • 您好@Krivvenz,“colorWithAlphaComponent”已重命名为“withAlphaComponent”。请参阅我编辑的答案。
    • 此代码不起作用。我们看不到推送视图是透明的。有没有人有其他想法?
    【解决方案6】:

    所讨论的最简单的解决方案是将 alpha 更改如下: Xcode 8 Swift 3 的更新版本是:

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

    目标 C:

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

    在此处参考 Apple 开发人员文档: https://developer.apple.com/reference/uikit/uiview/1622417-alpha

    【讨论】:

    • 是的,我应用了这个,但视图没有变得透明。我之前多次使用过这段代码。但这一次它不起作用。并将我的视图显示为纯黑色。所以任何替代方法或它已经随着新的 iOS 更新而改变?
    • yourParentView 后面的视图很可能必须是纯黑色的,请检查您的故事板的 xib 以及您的代码是否从其他任何地方设置为黑色。希望这会有所帮助
    • 我只是从一个视图推送另一个视图。在此代码之后,推送的视图将显示为透明。我之前用过很多次。就这么简单。 --> 设置 *set = [[settings alloc] initWithNibName:@"settings" bundle:nil]; --> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.3f]; --> [self.navigationController pushViewController:set animated:YES ];
    • 你使用的是xib还是storyboard?
    • 但现在我正在使用此代码,但它无法正常工作。推送的视图将以我们给定的任何颜色显示为纯色,而不是透明的。
    【解决方案7】:

    设置背景颜色的不透明度而不是 alpha 不会影响其子视图。

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

    或者您可以通过编程方式设置

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

    就是这样。编码快乐!!!

    【讨论】:

    • 有没有办法以编程方式做到这一点?
    • @DCIndieDev 抱歉,我还没有发现不透明度作为 UIView 的属性。所以由故事板设置。
    • 这是一个很好的答案。效果很好。
    • 这应该是公认的答案,根据需要工作。谢谢。
    • @MRizwan33 您可以从 [your UIView].layer.opacity 访问 opacity 属性
    【解决方案8】:

    目前只有一种方法使 父视图 透明并且不要将任何子视图放入父视图(不要将任何视图作为子视图),将子视图放在外面的父视图。要使父视图透明,您可以通过情节提要做到这一点。

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

    将另一个视图放在父视图之外。它会像魅力一样发挥作用。

    【讨论】:

      【解决方案9】:

      在 Swift 4.2 和 Xcode 10.1 中

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

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

      【讨论】:

      • @iOS 谢谢你,这个帮助了我。
      【解决方案10】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多