在 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 这不起作用。该按钮不包含图像。该按钮充满蓝色。
在 iOS7 中,有一个新的按钮类型,称为 UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS(7_0), // 标准系统按钮
检查您的 .xib 文件并将按钮类型更改为自定义
要以编程方式执行此操作,请将此行添加到
viewDidLoad
:
[UIButton buttonWithType:UIButtonTypeSystem];
iOS 7 似乎使用提供的图像作为 Alpha 遮罩来显示按钮的色调颜色。 将按钮类型更改为
UIButtonTypeCustom
对我来说很有效(感谢 user716216!)。
如果您已经有背景图像(就像我的情况一样),则将图像设置为背景并不总是有效。
let image = UIImage(named: "my-image")
myButton.setImage(image.withRenderingMode(.alwaysOriginal), for: .normal)
很有可能图像就在那里,但你只是看不到它。尝试将按钮的类型更改为
UIButtonTypeCustom
。如果这不起作用,请将按钮的背景颜色设置为 [UIColor clearColor];
斯威夫特5:
let aButton = UIButton(type: .custom) as UIButton
问题是 TintColor。默认情况下,iOS 会在每个按钮上投射蓝色色调。您可以通过 3 种方式绕过它。
更改色调颜色。
[button setTintColor:[UIColor blackColor]];
这可能会以您不希望的方式给您的图像着色。正如大多数其他人建议的那样,设置背景图像。
[button setBackgroundImage:[UIImage...]];
将 UIImageView 添加到您的按钮。
UIImageView * img = [[UIImageView alloc] initWithImage:[UIImage...]];
[button addSubView:img];
我也有同样的问题。 在我的故事板上,我有一个没有任何图像的按钮。
然后我会在代码中分配图像。
IOS 7 来了,我得到了很多蓝色图像。
这个决议很简单,但却令人困惑。如果我在故事板上分配任何图像,然后在运行时更改图像,它就可以正常工作。
即使您不打算使用它,您也始终必须在故事板上指定起始图像。
这对我有用
[myButton1 setBackgroundImage:[UIImage imageNamed:@"phones.png"] forState:UIControlStateNormal];
注意:执行此操作之前请删除正面图像。
旧线程,但我想插话,因为我也遇到了同样的问题。 问题只是当你应该调用 setBackgroundImage 时你却调用了 setImage。
在 iOS 13 中——只需将 Tint 属性设置为 White,同时将 UIButton 的类型保留为 Custom
给定的解决方案都不适合我。如果您没有在 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];
这个问题在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];
使用 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)
通过这种方式,您可以设置按钮图像状态,并且如果图像名称发生更改,也不会影响您的代码。
将所有四种状态(默认、突出显示、选定、禁用)的色调颜色设为透明颜色对我有用。
在 Swift 4 中,初始化您的
UIButton
并分配您的图像数据,如下所示:
let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)