2
[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 错误。
有没有人试过这个?

4

5 回答 5

4

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

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

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

在此处输入图像描述

于 2013-06-06T19:13:10.007 回答
2

像@codeplasma 回答一样,但不需要添加透明图像,只需创建一个空的UIImage

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

在 Objective-C 中,您可以使用[UIImage new].

于 2015-07-29T15:44:41.663 回答
0

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

于 2013-06-06T19:17:07.707 回答
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];
于 2014-03-06T05:40:47.363 回答
0

漏洞?

不,这不是错误,UIButton 是这样设计的,原因如下:当您为UIButton' UIControlStateNormal(正常状态)设置图像时,它会在其他状态(选择、禁用、突出显示)中保留它,以防您没有为其他州指定图像。

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

您可能认为将图像设置nil为所选状态将摆脱该状态的图像,但当然当状态更改时,它会看到它没有该状态的图像(它是nil!),但它确实对于 state UIControlStateNormal,所以它会使用那个,因此你被困在同一张图片上!

请注意,如果您将图像设置为与正常状态不同的状态,则它将仅针对该状态显示。

解决方法

老实说,您对按钮的图像/标题的意图听起来有点奇怪......也许您是 iOS 新手,也许有更多关于您的按钮是什么以及应该做什么的信息,我们可以建议一个更好的解决方案...... . 但是使用您提供给我们的信息解决此问题的最简单方法是为所选状态提供有效图像,最好是透明的,并且它也可以是 1x1 像素以节省空间。

否则,您可以这样做,UIImage在运行时创建一个作为占位符用作您的图像,但缓存它是一个好主意,也许创建一次并将其保存在 iVar 中

// Create a 1x1 UIImage at runtime
UIGraphicsBeginImageContext((CGSize){1.0f,1.0f});
UIImage *runtimeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// Setup your button 
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(20.0, 20.0, 100.0, 100.0);

// set the image for each state
[btn setImage:[UIImage imageNamed:@"Back.png"] forState:UIControlStateNormal];
[btn setImage:runtimeImage forState:UIControlStateSelected];

// have your text for the normal state
[btn setTitle:@"selected !" forState:UIControlStateNormal];
于 2013-06-06T19:33:36.690 回答