我对这个失去了理智。我将UIButton连接为Outlet。我想改变它的形象。在viewDidLoad函数中,我尝试像这样设置图像:
[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
什么都没发生。但是,如果我使用ImagePicker,它会以某种方式工作。在ImagePickers函数“didFinishPickingImage”中,我重复与上面完全相同的命令来设置图像并且它工作正常,图像正常显示。
我一直在想,也许按钮的图像本身没有刷新,但是尝试调用[button1 setNeedsDisplay]或[button1.imageView setNeedsDisplay]甚至[button1.imageView.image setNeedsDisplay]都不会做任何事情。
有没有人对此有任何想法?我已经浪费了两个小时了,我真的很沮丧,因为我确信原因一定是如此愚蠢,这是不可想象的。
答案 0 :(得分:80)
请检查您的按钮类型。
如果您的按钮类型为“系统”,则应将其更改为“自定义”
答案 1 :(得分:8)
这里有两件事要做:
#1,将您的代码更改为:
[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
和#2
确保您的UIImage返回有效图片。
换句话说,
UIImage * imageToSet = [UIImage imageNamed: @"house.png"];
if(imageToSet)
{
[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
} else {
// if you see this line in your console, then you know where to look for a problem
NSLog( @"why is my image object nil?");
}
答案 2 :(得分:6)
对于任何会发现自己处于类似情况的人;我在自定义单元格中使用提到的按钮进行表格视图。但是,单元格不会立即加载(即在viewDidLoad / viewWillAppear等内部),而是在tableView:cellForRowAtIndexPath函数内部。那时我的所有按钮变量都是零。我的解决方案是在创建单元格之后加载图像,之后它就会立即生效。
答案 3 :(得分:3)
以下是一些补充说明。 UIButton setImage:forState:是正确的方法:
[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
imageNamed是一种非常方便的方法来抓取图像,但要确保它返回一个对象。忘记将图像文件包含在当前目标中的所有时间都会得到我。
[UIImage imageNamed:@"house.png"]
您也不需要扩展程序。 SDK可以解决这个问题。
[UIImage imageNamed:@"house"]
即使UIControlState是位掩码,也不能将值组合在一起。这不是行不通的,我必须记住这一点,因为每次我使用这个电话都会让我感到高兴。
// NO NO NO
[button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateNormal|UIControlStateSelected];
// YES
[button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateNormal];
[button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateSelected];
答案 4 :(得分:2)
UIbutton
UITableViewCell
时出现同样的问题。
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"detail.png"] forState:UIControlStateNormal];
应该在UITableViewCell
答案 5 :(得分:1)
很高兴知道问题已经解决,但没有一个答案能真正解决问题。
通常,如果代码正确,则错误从“语法错误”转移到“逻辑错误”类别。没有明确的指南来处理它,但是这里有一个小清单,可以帮助任何人对其代码进行故障排除。
1)IBOutlet
未连接或重命名。
2)确保UIButton类型为custom
。
3)在代码中的其他位置设置了图像(不止一次)。
4)您试图通过任何不使用主线程的sync method
来设置图像。 (仅此一个线程就有几个线程。)
5)如果要将图像作为子视图嵌套,请确保问题不在于其父视图。
6)如果它出现在Simulator中,但没有出现在设备中,则为字母大写(代码和文件名中的大写字母,小写字母不同。
7)现代模拟器在较旧的计算机上可以使用很低的GPU内存。您可以调整模拟器选项使其显示。例如,两次(按Command +向右箭头)更改模拟器方向,您的更改就会出现。
开发人员通常忽略的其他但常见的陷阱
1)图片不存在,或者您犯了拼写错误。
2)文件类型与所提到的不同。 (JPG,PNG)。
答案 6 :(得分:0)
对我来说,就是移动这条线:
[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
来自awakeFromNib
方法
到viewDidLoad
方法
答案 7 :(得分:0)
我想, 不要这样创造 UIButton * nextButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 通过此create方法,UIButton是使用默认类型创建的,因此您的背景图像不起作用。 试试这个, UIButton * nextButton = [[UIButton alloc] initWithFrame:CGRectMake(9,154,300,48)]; 或者其他,除了buttonWithType
答案 8 :(得分:0)
您要检查的最后一件事 - 确保您在主线程上设置图像!刚刚遇到一个问题,我在ALAssetLibrary的回调中设置了一个按钮图像(从照片库中获取图像)。在我点击按钮之前,图像不会更新。事实证明回调发生在主要... ...
答案 9 :(得分:0)
这种情况正在发生,因为默认情况下单击按钮后按钮的状态不会保持选中状态。
我通过在该按钮上单击并切换所选状态的IBaction来解决它。
-(IBAction) checkButtonClicked:(id)sender{
checkButton.selected = !checkButton.selected;
}
答案 10 :(得分:0)
就我而言,它是由自定义动画代码绘制的,而不是由图像设置的,所以它不能通过设置任何图像来工作,它必须改变动画代码。
答案 11 :(得分:0)
使用setBackgroundImage:forState:
答案 12 :(得分:0)
对于图像,您必须将其作为副本而不是引用导入到项目中。因此,当您将文件添加到项目时,请选择“创建组”而不是“创建文件夹引用”。还要确保选中“如果需要复制项目”。
这令人困惑,因为当您将图像用作纹理时(例如,用于Sprites),导入为参考有效。但是,当您要将图像用于按钮时(例如,在[UIImage imageNamed:@"house.png"]
答案 13 :(得分:0)
对于那些没有出现系统映像问题的人,只需使用systemName:
而不是named
if let starImg = UIImage(systemName: "star.fill") {
button.setImage(starImg, for: .normal)
}
适用于ios13及更高版本...