UIButton setImage不起作用

时间:2012-01-27 00:46:05

标签: iphone objective-c uibutton

我对这个失去了理智。我将UIButton连接为Outlet。我想改变它的形象。在viewDidLoad函数中,我尝试像这样设置图像:

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

什么都没发生。但是,如果我使用ImagePicker,它会以某种方式工作。在ImagePickers函数“didFinishPickingImage”中,我重复与上面完全相同的命令来设置图像并且它工作正常,图像正常显示。

我一直在想,也许按钮的图像本身没有刷新,但是尝试调用[button1 setNeedsDisplay]或[button1.imageView setNeedsDisplay]甚至[button1.imageView.image setNeedsDisplay]都不会做任何事情。

有没有人对此有任何想法?我已经浪费了两个小时了,我真的很沮丧,因为我确信原因一定是如此愚蠢,这是不可想象的。

14 个答案:

答案 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及更高版本...