UIButton将图像设置为状态法线,将图像隐藏在不同的状态

时间:2013-06-06 18:59:32

标签: ios cocoa-touch uibutton uikit

[button setImage: [UIImage imageNamed:@"Back.png"] forState:UIControlStateNormal];
[button setTitle: @"Title" forState:UIControlStateSelected];

我希望按钮能够以正常状态显示图像,但在选定状态下显示“标题”一词。但是我无法使用此代码。单击按钮到选定状态时,它显示图像,图像覆盖标题。我无法摆脱处于选定状态的图像。

 [button setImage: [UIImage imageNamed:@"Back.png"] forState:UIControlStateNormal];
 [button setImage: [UIImage imageNamed:@"Back2.png"] forState:UIControlStateSelected];

但这很有效。图像从Back to Back2翻转。或者另一种方式也适用

[button setImage: [UIImage imageNamed:@"Back.png"] forState:UIControlStateSelected];
[button setTitle: @"Title" forState:UIControlStateNormal];

这很简单,我开始认为这是UIButton的错误 有人曾尝试过这个吗?

5 个答案:

答案 0 :(得分:4)

为项目添加一些小的透明图像(1px就足够了)并命名它,例如transparent.png。然后将此行添加到代码中:

[button setImage: [UIImage imageNamed:@"transparent"] forState:UIControlStateSelected];

另一个更简单的解决方案是使用界面构建器并将图像设置为不同的状态。在这种情况下,您甚至不需要使用透明图像;只需将Image字段留空为Selected状态。

enter image description here

答案 1 :(得分:1)

喜欢@codeplasma的答案,但不需要添加透明图片,只需创建一个空的UIImage

button.setImage(UIImage(), forState: .Selected)

在Objective-C中,您可以使用[UIImage new]创建它。

答案 2 :(得分:0)

你必须在某些UIButtons中显式设置按钮状态(如圆角矩形按钮),点击它时不会自动发生。

答案 3 :(得分:0)

错误?

不,这不是一个错误,UIButton是这样设计的,这就是原因:当你为UIButton的{​​{1}}(正常状态)设置图像时,它会在整个如果您没有为其他状态指定图像,则会显示其他状态(已选中,已禁用,已突出显示)。

这意味着您可以使用单个图像设置按钮,系统会在突出显示状态下添加深色突出显示,并使按钮在禁用状态下看起来像是alpha 0.5。

您可能认为将图像设置为UIControlStateNormal以获取所选状态将摆脱该状态,但当状态发生变化时,它会看到它没有该状态的图像(它是nil!),但它适用于状态nil,所以它会使用那个,因此你会被困在相同的图像中!

请注意,如果您将图像设置为不同的状态,那么它只会显示该状态。

解决方法

老实说,你对按钮的图像/标题声音的意图有点奇怪...也许你是iOS的新手,可能有更多关于你的按钮是什么和应该做什么的信息,我们可以建议一个更好的解决方案....但是根据你给我们的信息解决这个问题的最简单方法是为所选状态提供一个有效的图像,一个最好是透明的,也可以是1x1像素,以节省空间。

否则你可以这样做,在运行时创建一个UIControlStateNormal用作占位符作为你的图像,但是一个好主意,缓存它,也许创建它一次并保持在一个IVAR

UIImage

答案 4 :(得分:0)

我建议在这种情况下使用SetBackgroundImage,而不是使用setImage。这是一个适用于类似解决方案的解决方案:

UIImage *cardBackImage = [UIImage imageNamed:@"card.png"];
UIImage *cardFrontImage = [UIImage imageNamed:@"transparent.png"];

[cardButton setBackgroundImage:cardFrontImage forState:UIControlStateSelected];
[cardButton setBackgroundImage:cardFrontImage forState:UIControlStateSelected|UIControlStateDisabled];

[cardButton setBackgroundImage:cardBackImage forState:UIControlStateNormal];