iOS7 忽略 UIImageView 的 backgroundColor?

Posted

技术标签:

【中文标题】iOS7 忽略 UIImageView 的 backgroundColor?【英文标题】:backgroundColor of UIImageView is ignored on iOS7? 【发布时间】:2013-09-26 20:00:26 【问题描述】:

ios7 之前,这样的代码在 UIImageView 的子类上运行良好。 但不再工作了。

-(id) initWithFrame:(CGRect) frame
    self = [super initWithFrame:frame];
    if(self)
        self.backgroundColor = [UIColor redColor];
    
    return self;

我还在 InterfaceBuilder 上检查了这一点。 再一次,UIImageView 的 backgroundColor 的值不会改变任何东西... 所有这些都适用于 UIView... 那么,它的 UIImageView 怎么了?不还是 UIView 的子类吗? 还是从 iOS7 禁用此属性? 或者是否有任何我必须设置的新属性才能使其正常工作?

可能这段代码更好地描述了这个问题:

UIImageView *imageView =[ [UIImageView alloc] initWithImage:[UIImage imageNamed:@"ImageName.png"];
imageView.backgroundColor = [UIColor redColor];

更改 backgroundColor 的值在它没有 image 属性时有效。 但后来它不再是 backgroundColor...

【问题讨论】:

你是如何创建图像视图的?它的大小是多少,图像的大小是多少?您使用的是什么内容模式? imageView的frameSize和imageSize都是35x35。我没有将 contentMode 设置为应用其默认值 (UIViewContentModeScaleToFill)。为了创建 UIImageView 的子类,它实际上调用了 initWithFrame: 虽然它有点自定义设置两个附加值。 (initWithFrame:commandTag:mainController:) 因为我用这个作为按钮,所以颜色是之后设置的,而不是在 initWithFrame 中。 那么如果图片和视图大小一样,你希望什么时候可以看到背景色? 对不起,我不知道我是否明白你的意思,但是通过图像应该可以看到背景颜色的变化。直到 iOS6 为止,它都是这样工作的。 所以图像是部分透明的?你试过不加图片吗? 【参考方案1】:

如果您的 UIImageView 来自 .xib/.storyboard,则将调用 initWithCoder: 而不是 initWithFrame:。作为一个例子,我把这个小的 UIImageView 子类放在一起,然后将一个带有居中内容的 TestImageView 放在故事板内的视图控制器的视图中。 TestImageView 的背景颜色在情节提要中设置为红色。

@implementation TestImageView

- (id)initWithFrame:(CGRect)frame 
    self = [super initWithFrame:frame];
    if (self) 
        self.backgroundColor = [UIColor blueColor];
    
    return self;


- (id)initWithCoder:(NSCoder *)aDecoder 
    self = [super initWithCoder:aDecoder];
    if (self) 
        self.backgroundColor = [UIColor greenColor];
    
    return self;


- (void)setBackgroundColor:(UIColor *)backgroundColor 
    NSLog(@"setting background color to %@", backgroundColor);
    [super setBackgroundColor:backgroundColor];


@end

运行应用程序创建了这个输出:

setting background color to UIDeviceRGBColorSpace 1 0 0 1
setting background color to UIDeviceRGBColorSpace 0 1 0 1

这在屏幕上:

如您所见,setBackgroundColor 首先是使用故事板中的红色调用的(这发生在[super initWithCoder:aDecoder]),然后使用 initWithCoder 中的绿色调用。

【讨论】:

哇!非常感谢你。但我不使用情节提要,没有界面构建器,但一切都是由代码制作的。无论如何,backgroundColor 是否仍然适用于 iOS7?在 iOS7 和 XCode5 之前,我所做的一切都很好。 嗨,格雷格,我还有一个问题。当您更改背景颜色时,是否也可以通过图像看到这种变化?我相信在 iOS7 之前这是可能的。我的应用实际上就是这样工作的。 是的,背景颜色通过图像视图中图像的透明部分显示。我更新了我的应用程序中的图像,使其中心有一个透明区域,并更新了屏幕截图以显示它的外观。 感谢您的更新。是否可以在中间更改图像的 alpha 值?现在它是背景或图像,但你可以混合吗?我告诉你目的。我将 UIImageView 用作按钮并将背景颜色更改为开/关。这就是为什么我需要通过图像看到颜色的变化。 是的,我创建了一个不透明度为 50% 的新 png,绿色背景与图像视图中的 png 混合。 (我没有费心将新图片上传到答案。)【参考方案2】:

只是为了更新。 正如 Wain 和 Greg 建议的那样,改变图像本身的不透明度解决了问题。 只是不知道为什么在 iOS7 之前没关系,但在 iOS7 之后很重要 我仍然想知道这可能只是 iOS7 本身的问题。无论如何,虽然我有近 200 张图片要处理,但最好开始修改它们,而不是等待 Apple 的答复。 谢谢你的帮助!

【讨论】:

以上是关于iOS7 忽略 UIImageView 的 backgroundColor?的主要内容,如果未能解决你的问题,请参考以下文章

IOS7:Pop ViewController 强制 UIImageView 掉落

iOS7 Autolayout 和 UIImageview 超大

iOS7 自动布局与 Tabbar 结合 UIScrollView 和可缩放 UIImageView 不起作用

iOS7 上 UICollectionViewCell 中的 UIImageView 自动布局问题,但在 iOS8 上没问题

UIImageView 设置为 imageWithData 忽略 contentMode

ModalViewController 中的 UIImageView 正在忽略 ContentMode - iPhone