173

在 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 中这行不通。该按钮不包含图像。按钮用蓝色填充。

4

15 回答 15

387

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

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

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

[UIButton buttonWithType:UIButtonTypeSystem]; 
于 2013-08-12T12:30:50.837 回答
54

似乎 iOS 7 正在使用提供的图像作为 Alpha 掩码来显示按钮的色调颜色。将按钮类型更改为UIButtonTypeCustom对我有用(感谢 user716216!)。如果您已经有背景图像,例如我的情况,将图像设置为背景并不总是有效。

于 2014-01-23T16:03:12.040 回答
39

斯威夫特 3、4、5:

let image = UIImage(named: "my-image")
myButton.setImage(image.withRenderingMode(.alwaysOriginal), for: .normal)
于 2017-02-28T14:42:24.550 回答
24

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

于 2013-08-08T18:44:12.693 回答
11

对于快速:

    let aButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
于 2014-11-11T13:49:51.577 回答
9

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

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

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

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

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

[button addSubView:img];

于 2013-11-21T16:33:31.003 回答
6

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

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

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

该决议很简单,但令人困惑。如果我在情节提要上分配任何图像,然后在运行时更改图像,它就可以正常工作。

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

于 2013-09-23T07:56:13.613 回答
3

这对我有用

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

注意:在执行此操作之前删除正面图像。

于 2013-12-09T12:41:32.407 回答
3

旧线程,但我想插话,因为我遇到了同样的问题。问题只是当你应该调用 setBackgroundImage 时你正在调用 setImage。

于 2018-01-05T20:45:33.493 回答
1

没有一个给定的解决方案对我有用。如果您没有在 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];
于 2013-10-14T15:27:50.657 回答
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];
于 2014-09-05T10:43:07.727 回答
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)

通过这种方式,您可以设置按钮图像状态,并且如果图像名称发生更改,它不会影响您的代码。

于 2018-01-08T18:00:21.040 回答
1

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

于 2019-11-01T15:51:53.393 回答
0

使所有四种状态(默认、突出显示、选定、禁用)的色调颜色为 clearcolor 对我有用。

于 2015-10-23T07:19:59.953 回答
-1

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

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
于 2018-12-18T08:17:26.093 回答