设置UIButton图像会导致iOS 7中的蓝色按钮


163

在iOS 6 SDK上,我编写了以下代码行以在按钮内显示图像:

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不能正常工作。该按钮不包含图像。按钮填充为蓝色。


单击按钮时是否显示图像?
JustAnotherCoder

Answers:


378

在iOS7中,有一个名为UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS(7_0)的新按钮类型,//标准系统按钮

检查您的.xib文件并将按钮类型更改为“自定义” 看图片

要以编程方式执行此操作,请将此行添加到viewDidLoad

[UIButton buttonWithType:UIButtonTypeSystem]; 

2
[UIButton buttonWithType:UIButtonTypeSystem];
2013年

57
请注意,此解决方案确实会消除系统色调的颜色,但也会导致突出显示状态和正常状态之间发生硬过渡。如果您希望保留系统行为,动画等,但是想要消除色彩,请尝试[myUIButton setImage: [[UIImage imageNamed: @"myButtonImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] forState: UIControlStateNormal];(在IB中将按钮类型设置为“系统”)。
JWK 2013年

谢谢,这非常有帮助。在我们的例子中,按钮甚至被剪裁为透明PNG的形状,然后进行着色。
g_pass 2014年

真是的,他们把那藏起来很好,不是吗?
Maury Markowitz 2014年

它的工作原理是:)您的代码中可能还有其他问题。如果你看的Xcode 6.1,你可以清楚地看到可用的选项..
Chamira费尔南多

53

似乎iOS 7使用提供的图像作为Alpha遮罩来显示按钮的色泽。将按钮类型更改UIButtonTypeCustom为可以解决问题(感谢user716216!)。如果您已经有背景图像,那么将图像设置为背景并不总是可行,就像我的情况一样。


谢谢!原始用户忘记接受它作为答案。
jigzat 2014年

它对我
有用

29

斯威夫特3,4,5:

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

24

图像很有可能在那里并且您看不到它。尝试将按钮的类型更改为UIButtonTypeCustom。如果这样不起作用,请将按钮的背景色设置为[UIColor clearColor];


9

问题是TintColor。默认情况下,iOS会在每个按钮上方添加蓝色色调。您可以通过3种方式解决它。

  1. 更改色调颜色。[button setTintColor:[UIColor blackColor]]; 这可能会以您不希望的方式为图像着色。

  2. 如大多数其他建议一样,设置背景图像。 [button setBackgroundImage:[UIImage...]];

  3. 将UIImageView添加到您的按钮。

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

[button addSubView:img];



6

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

然后,我将在代码中分配图像。

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

该决议既简单又令人困惑。如果我在情节提要板上分配任何图像,然后在运行时更改图像,则效果很好。

即使您不打算使用情节提要,也必须始终在情节提要上指定起始图像。


3

这对我有用

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

注意:在执行此操作之前,请先移除正面图像。


请如何删除背景图片!
simbesi.com 2014年

3

旧线程,但我想插话,因为我也有同样的问题。问题是您应该在调用setBackgroundImage时调用setImage。


1

给定的解决方案都不适合我。如果未在情节提要中设置初始图像,则仍可以使用来更改按钮的图像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];

1

此问题称为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];

它很有帮助@Shane
Rudra

1

使用Xcode 9.2,以上解决方案均无法满足我的需求。

我一直在寻找一种解决方案,可以让我在情节提要中为原始设置模式设置图像.normal.selected UIControlState图像,但是在Swift文件中,不应该存在有关图像名称的字符串文字。

基本上,在您的代码内,您将获得在情节提要板中设置的.normal状态图像,并将其重新渲染为.alwaysOriginal(与.selected状态相同),然后,您将设置该图像(现在呈现为原始图像,并且不会受到有关您的状态(.normal.selected)的色调)UIButton

这里是:

// 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)

这样,您可以设置按钮的图像状态,并且如果图像名称更改,则不会影响您的代码。


1

在iOS 13中-只需将Tint属性设置为White,同时将UIButton的类型保留为Custom


0

使所有四个状态(默认,突出显示,已选择,已禁用)的颜色都变为透明色对我有用。


-1

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

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
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.