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

问题描述 投票:0回答:15

在 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 这不起作用。该按钮不包含图像。该按钮充满蓝色。

uibutton uiimage ios7
15个回答
389
投票

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

检查您的 .xib 文件并将按钮类型更改为自定义 Look at the image

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

viewDidLoad
:

[UIButton buttonWithType:UIButtonTypeSystem]; 

54
投票

iOS 7 似乎使用提供的图像作为 Alpha 遮罩来显示按钮的色调颜色。 将按钮类型更改为

UIButtonTypeCustom
对我来说很有效(感谢 user716216!)。 如果您已经有背景图像(就像我的情况一样),则将图像设置为背景并不总是有效。


41
投票

斯威夫特 3、4、5 :

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

24
投票

很有可能图像就在那里,但你只是看不到它。尝试将按钮的类型更改为

UIButtonTypeCustom
。如果这不起作用,请将按钮的背景颜色设置为
[UIColor clearColor];


11
投票

斯威夫特5:

let aButton = UIButton(type: .custom) as UIButton

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];

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


3
投票

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


2
投票

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


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];

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];

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)

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


0
投票

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


-2
投票

Swift 4 中,初始化您的

UIButton
并分配您的图像数据,如下所示:

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
© www.soinside.com 2019 - 2024. All rights reserved.