在 iOS7中设置 UIButton 图像会导致蓝色按钮

在 iOS6SDK 上,我写了以下几行代码来显示按钮内的图像:

NSURL *thumbURL2 = [NSURL URLWithString:@"http://example.com/thumbs/2.jpg"];
NSData *thumbData2 = [NSData dataWithContentsOfURL:thumbURL2];
UIImage *thumb2 = [UIImage imageWithData:thumbData2];
[btn2 setImage:thumb2 forState:UIControlStateNormal];
[self.view addSubview:btn2];

但是现在有了 Xcode 5和 iOS 7,这种方法就行不通了。按钮不包含图像。这个按钮是蓝色的。

88192 次浏览

很有可能图像就在那里,只是你看不到而已。尝试将按钮的类型更改为 UIButtonTypeCustom。如果这不起作用,设置按钮的背景颜色为 [UIColor clearColor];

在 iOS7中有一个新的按钮类型,叫做 UIButtonTypeSystem NS _ ENUM _ AVAILABLE _ IOS (7 _ 0) ,//标准系统按钮

检查.xib 文件并将按钮类型更改为 CustomLook at the image

要以编程方式完成此操作,请将以下代码行添加到 viewDidLoad:

[UIButton buttonWithType:UIButtonTypeSystem];

我也有同样的问题。 在我的故事板上,我有一个没有任何图像的按钮。

然后在代码中分配图像。

IOS 7来了,我得到了很多蓝色图像。

解决方案简单但令人困惑。如果我在故事板上分配任何图像,然后在运行时更改图像,那么它工作得很好。

即使您不打算使用它,也必须在情节串连图板上指定一个起始图像。

所有给出的解决方案都不适合我。如果不在 Storyboard 中设置初始图像,仍然可以使用 setBackgroundImage更改按钮的图像。

对于您的示例,只需要进行一个小的更改。

NSURL *thumbURL2 = [NSURL URLWithString:@"http://example.com/thumbs/2.jpg"];
NSData *thumbData2 = [NSData dataWithContentsOfURL:thumbURL2];
UIImage *thumb2 = [UIImage imageWithData:thumbData2];
[btn2 setBackgroundImage:thumb2 forState:UIControlStateNormal];
[self.view addSubview:btn2];

问题是 TintColor。默认情况下,iOS 在每个按钮上都会显示一个蓝色调的颜色。你可以通过三种方法绕过它。

  1. 改变颜色 这可能会使你的图像以你不希望的方式变色

  2. 正如大多数其他建议,设置背景图像

  3. 向按钮添加 UIImageView。

UIImageView * img = [[UIImageView alloc] initWithImage:[UIImage...]];

[button addSubView:img];

这招对我很管用

[myButton1 setBackgroundImage:[UIImage imageNamed:@"phones.png"] forState:UIControlStateNormal];

注意: 在这样做之前删除前面的图像。

看起来 iOS7使用的图像只是作为一个阿尔法掩码来显示按钮的色彩。 将按钮类型更改为 UIButtonTypeCustom对我来说很有用(感谢用户716216!)。 如果你已经有了一个背景图像,设置图像作为背景并不总是有效的,就像我的情况一样。

这个问题在 xcode 中称为按钮的蓝色问题。 当我们通过代码制作按钮时,按钮默认显示蓝色。这可以通过根据单元格的颜色为黑色或白色分配色彩来解决。 密码是:

UIImage *closebtnimg = [UIImage imageNamed:@"icon_uncheck.png"];
UIImage *closebtnimg1 = [UIImage imageNamed:@"icon_checked.png"];


Custombutton *button = [Custombutton buttonWithType:UIButtonTypeRoundedRect];
[button setFrame:CGRectMake(52, 66, 25, 24)];
[button setBackgroundImage:closebtnimg forState:UIControlStateNormal];
[button setBackgroundImage:closebtnimg1 forState:UIControlStateSelected];
[button setTintColor:[UIColor whiteColor]];
[cell.contentView addSubview:button];
[button addTarget:self action:@selector(changeImage:)  forControlEvents:UIControlEventTouchUpInside];

快速:

    let aButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton

为所有四个状态(默认,突出显示,选择,禁用)的色彩作为清晰的颜色为我工作。

迅捷3,4,5:

let image = UIImage(named: "my-image")
myButton.setImage(image.withRenderingMode(.alwaysOriginal), for: .normal)

陈词滥调,但我想插一句,因为我也有同样的问题。问题只是在应该调用 setBackoundImage 时却调用 setImage。

使用 Xcode 9.2,以上所有解决方案都不能满足我的要求。

我正在寻找一个解决方案,让我设置 .normal.selected UIControlState图像内的故事板为他们的 原始渲染模式,但是,在 Swift 文件,没有字符串文字应该存在的图像名称。

基本上,在你的代码中,你会得到你在故事板中为 .normal状态设置的图像,并将其重新渲染为 .alwaysOriginal(与 .selected状态相同) ,然后,你将为 UIButton的相关状态(.normal.selected)设置该图像(现在渲染为原始的,不受色调的影响)。

这就是:

// Get your .normal image (you set via your storyboard) and render it as original
let unselectedImage = yourButton.image(for: .normal)?.withRenderingMode(.alwaysOriginal)
// Set your normal image but this time rendered as original
yourButton.setImage(unselectedImage, for: .normal)
// Same for selected state
let selectedImage = yourButton.image(for: .selected)?.withRenderingMode(.alwaysOriginal)
yourButton.setImage(selectedImage, for: .selected)

这样,您可以设置您的按钮图像状态,如果图像名称将改变,它不会影响您的代码。

Swift 4中,初始化你的 UIButton并分配你的图像数据如下:

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)

在 iOS13中——只需将 Tint 属性设置为 White,同时将 UIButton 的类型保持为 Custom