【问题标题】:How to check if a UIView's backgroundColor is clearColor?如何检查 UIView 的 backgroundColor 是否为 clearColor?
【发布时间】:2015-10-12 11:21:11
【问题描述】:

这不起作用:

if([myView.backgroundColor isEqual:[UIColor clearColor]])
   NSLog("Background is clear");
else
   NSLog("Background is not clear");

P.S:要重现案例,在界面生成器中拖动一个uiview,将其背景颜色设置为从界面生成器中清除颜色。设置视图的出口,然后在 viewDidLoad 中使用上面的代码进行比较。

这里是测试项目的链接:https://drive.google.com/file/d/0B_1hGRxJtrLjMzUyRHZyeV9SYzQ/view?usp=sharing

这是 Interface Builder 的快照:

【问题讨论】:

  • 没有理由不这样做。是什么让你认为它不起作用?
  • @villy393:NSLog 结果“背景不清晰”让我觉得它不起作用,因为我已将视图的背景颜色设置为从界面生成器清除颜色。
  • 我认为可能还有其他事情发生。如果你比较 [[UIColor clearColor] isEqual:[UIColor clearColor]] 它会返回 true。
  • 它显然会返回true。好的重现案例,在界面生成器中拖动一个uiview,将其背景颜色设置为从界面生成器中清除颜色。设置视图的出口,然后在 viewDidLoad 中进行比较。
  • @CunchalRaj 检查我更新的答案,应该可以解决问题

标签: ios objective-c uiview uicolor


【解决方案1】:

您的代码是正确的,只是您的假设不正确。运行这些行来看看你哪里出错了:

NSLog("view color: %@", myView.backgroundColor);
NSLog("expected color: %@", [UIColor clearColor]);

【讨论】:

  • 输出为:视图颜色:UIDeviceRGBColorSpace 0 0 0 0 预期颜色:UIDeviceWhiteColorSpace 0 0
【解决方案2】:

也许两种颜色都清晰但仍然不一样? alpha值相同还不够……

UIColor.clearColor() == UIColor(white: 1.0, alpha: 0.0) // false
UIColor.clearColor() == UIColor(white: 0.0, alpha: 0.0) // true

试试

if([myView.backgroundColor isEqual:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]])
   NSLog("Background is clear");
else
   NSLog("Background is not clear");

更好的方法可能是检查 alpha 是否为 0.0:

CGFloat alpha = CGColorGetAlpha(myView.backgroundColor.CGColor);
if( alpha == 0.0 )
   NSLog("Background is clear");
else
   NSLog("Background is not clear");

【讨论】:

  • 我所做的是拖动一个 UIView(默认为白色),将其背景颜色设置为从界面生成器中清除。给uiview放一个outlet,然后在viewDidLoad中写上上面的代码。朋友,你觉得哪里不对?
  • 看起来界面生成器创建了一个带有 alpha 0 的黑色 RGB 图像,而 clearColor 是一个带有 alpha 0 的黑色灰度图像。看起来相同,但比较不同。 if( [self.myView.backgroundColor isEqual:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0] ]
【解决方案3】:

你的代码是正确的

UIView *aView = [[UIView alloc] init];
aView.backgroundColor = [UIColor clearColor];

if([aView.backgroundColor isEqual:[UIColor clearColor]]) {
     NSLog(@"Background is clear");
} else {
     NSLog(@"Background is not clear");
}

结果:

2015-07-22 15:22:57.430 APP[1568:24173] 背景清晰

更新:界面生成器默认颜色的情况

发件人:UIView Class Reference

@property(nonatomic, copy) UIColor *backgroundColor

讨论

对此属性的更改可以设置动画。 默认值为nil, 这会产生透明的背景颜色。

如果您从界面生成器中将颜色设置为默认值,backgroundColor 属性将为 nil,因此与 [UIColor clearColor] 的比较将为 false。

你可以更新你的代码来处理这种情况:

if([self.aView.backgroundColor isEqual:[UIColor clearColor]] ||  self.aView.backgroundColor == nil) {
    NSLog(@"Background is clear");
} else {
    NSLog(@"Background is not clear");
}

更新:Interface builder 清除颜色的情况

您可以测试 alpha 值:

CGFloat bgColorAlpha = CGColorGetAlpha(self.aView.backgroundColor.CGColor);

if (bgColorAlpha == 0.0){
    NSLog(@"clear ");
}else{
   NSLog(@"not clear ");
}

2015-07-22 16:56:23.290 APP[1922:38283] 清除

更多信息:

How to compare UIColors

Comparing colors in Objective-C

UIColor comparison

【讨论】:

  • 我没有在代码中初始化视图,而是从界面构建器中初始化的。要重现该案例,请在界面构建器中拖动一个 uiview,将其背景颜色设置为从界面构建器中清除颜色。设置视图的出口,然后在 viewDidLoad 中进行比较。
  • @CnchalRaj 检查我的更新我已经使用来自 IB 的创建的 UIView 测试了代码
  • 不,伙计,它也没有用。如果我们从界面生成器中选择 clearColor,backgroundColor 属性不会变为 nil。这是语句的 NSLog: NSLog("view color: %@", myView.backgroundColor);查看颜色:UIDeviceRGBColorSpace 0 0 0 0
  • 如果我 NSLog 这个语句: NSLog("expected color: %@", [UIColor clearColor]);它打印:预期颜色:UIDeviceWhiteColorSpace 0 0
  • 这可能是个问题,因为您的代码表明即使 alpha 为 0.9999(实际上是不透明的)也很清楚。我的建议就像我的回答一样。将 alpha 保留为 CGFloat 并改为与 0.0 进行比较。或者可能是一个小数字,例如“ if alpha
猜你喜欢
  • 2011-10-29
  • 2016-04-05
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多