UIButton 仅在 UIControlStateNormal 上设置图像

Posted

技术标签:

【中文标题】UIButton 仅在 UIControlStateNormal 上设置图像【英文标题】:UIButton only setimage on UIControlStateNormal 【发布时间】:2013-06-28 20:36:55 【问题描述】:

我有一个简单的 UIButton 问题

只有当按钮处于 UIControlStateNormal 时,我才需要在按钮上显示图像,并且如果我单击它则不显示它。

这是我的代码:

[cardButton setImage:[UIImage imageNamed:@"cardBack.png"] forState:UIControlStateNormal];

当一个按钮被点击时,我会改变它的状态:

cardButton.selected = card.isFaceUp;

现在的问题是,即使按钮的状态切换到 UIControlStateSelected,图像仍然存在...

我检查了 imageForState 方法,意外地发现[cardButton imageForState:UIControlStateSelected] 返回的值与[cardButton imageForState:UIControlStateNormal] 相同

我从未在任何地方设置选定状态的图像值,也不知道这里发生了什么。

需要你的帮助!非常感谢!

【问题讨论】:

【参考方案1】:

UIButton 的实例使用其他状态的“正常”状态标题、图像和背景图像,如果没有明确设置其他状态,并且(令人讨厌)即使您明确尝试将这些属性设置为 nil为其他州。我通常做的是创建一个像素清晰的图像并将其用于其他状态,例如:

[cardButton setImage:[UIImage imageNamed:@"clear"] forState:UIControlStateSelected]

您需要注意的另一件事是状态 UIControlStateSelectedUIControlStateSelected | UIControlStateHighlighted 实际上是不同的,因此如果您不希望在用户点击并按住 当前选中的按钮,还需要设置:

[cardButton setImage:[UIImage imageNamed:@"clear"] forState:UIControlStateSelected | UIControlStateHighlighted]

【讨论】:

谢谢!这对我有用。指出设置 nil 对其他州不起作用。 但是,我仍然想知道是否有更通用的方法来实现这一点。否则,如果我只需要将我的第一张图像用于正常状态,我需要为所有其他状态设置清晰图像。 @zeroliu:我通常至少在正常和高亮状态下都有真实的艺术品(不是清晰的像素黑客东西)。并且其他状态标志(选择、禁用和“应用程序”)的使用频率较低,所以我只需要使用几次清除像素技巧。不过这很烦人。【参考方案2】:

这是一种不使用 1 像素图像的解决方法:

    if (!cardButton.isSelected && cardButton.isEnabled)
        [cardButton setImage:[UIImage imageNamed:@"cardback.jpg"] forState:UIControlStateNormal];
    else
        [cardButton setImage:nil forState:UIControlStateNormal];
    

我想如果您尝试创建一个需要在应用商店中发布的应用,您会想要更优雅的 1 像素透明图像解决方案。

【讨论】:

【参考方案3】:

试试下面的代码行?

[cardButton setImage:nil forState:UIControlStateSelected];

【讨论】:

Aaron 在他的回答中解释了原因。

以上是关于UIButton 仅在 UIControlStateNormal 上设置图像的主要内容,如果未能解决你的问题,请参考以下文章

UIButton - 仅在没有待处理事件时调用 Release?

UIButton - 仅在一个方向上可拉伸的背景图像?

UIbutton 仅在 longPress 上看起来被点击(突出显示)?

如何仅在 UIButton 中为标题的特定部分设置图像

为啥 UITableViewCell 上的 UIButton 仅在触摸手势持续很短时间时才会变暗

UIButton 切换标题。仅在第二次单击后更改