UIButton 为状态正常设置图像,在不同状态下隐藏该图像

Posted

技术标签:

【中文标题】UIButton 为状态正常设置图像,在不同状态下隐藏该图像【英文标题】:UIButton set image for state normal, hide that image in different states 【发布时间】:2013-06-06 18:59:32 【问题描述】:
[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 错误。 有没有人试过这个?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

太棒了..!! ;-)【参考方案3】:

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

【讨论】:

【参考方案4】:

错误?

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

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

您可能认为将所选状态的图像设置为nil 将摆脱该状态的图像,但当然当状态更改时,它会看到它没有该状态的图像(它是nil !),但它适用于状态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];

【讨论】:

谢谢,丹尼尔。你是对的,我是 iOS 新手。我的作业是设计一个纸牌游戏,用户单击卡片以显示其自身(标题),然后再次单击以将卡片翻面。我会尝试你的透明图像解决方法。教授暗示这会很棘手,他声称使用两条线将图像设置为适当的状态。想知道他是怎么做到的。 你应该看看 UITapGestureRecognizer。您可以只使用带有卡片图像的图像视图,以及顶部隐藏的标签。将 UITapGestureRecognizer 添加到卡片图像视图并切换标签以显示/隐藏。真的很简单。【参考方案5】:

我建议在这种情况下使用 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];

【讨论】:

以上是关于UIButton 为状态正常设置图像,在不同状态下隐藏该图像的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 选择状态的图像出现在正常状态的图像后面

如何在 UIButton 中的选定状态下从正常状态和标题文本设置 UIImage

在 UITapGestureRecognizer(双击)添加到 UIButton 会减慢将按钮图像设置为选中状态

根据状态设置自定义 UIButton 样式

针对不同状态更改 UIButton 的渐变

选择时避免 UIButton 反转颜色