【问题标题】:UIButton - Image in Default State, Title in Selected StateUIButton - 默认状态下的图像,选定状态下的标题
【发布时间】:2013-02-24 13:55:14
【问题描述】:

所以我正在通过 iTunes U 完成 2013 年冬季斯坦福 iOS/Objective-C 课程的第二个作业,最后一部分让我发疯了。

这是一款纸牌配对游戏。每张卡片在视图中都表示为一个 UIButton。当卡片对象面朝上时,UIButton 处于选中状态,而当卡片面朝下时,UIButton 处于默认状态。找到匹配后也可以禁用卡片。

作业要求在卡片背面放一张图片。换句话说,每个 UIButton 在默认状态下都需要显示图像,而在选中或禁用状态时只需显示标题属性。

看起来很简单...

首先我在 GUI(故事板)中尝试了这个,将背景图像设置为我的图像,然后确保选中和禁用状态都没有图像。这导致图像显示,但随后标题文本仅显示在图像上。一些搜索发现了这个原因:除非明确告知,否则 UIButton 会将所有其他 UIControlStates 默认为 UIControlStateNormal。

现在我一直试图让它以编程方式工作,但仍然没有运气。所有作为卡片的 UIButtons 都在一个 IBOutletCollection 中,它是一个 NSArray (cardButtons)。在 viewDidLoad 函数中,我有一个遍历所有按钮的 for 循环:

UIImage *cardBack = [UIImage makeSomeImage...];
for (UIButton *oneButton in cardButtons) {
[oneButton setBackgroundImage:cardBack forState:UIControlStateNormal];
[oneButton setBackgroundImage:nil forState:UIControlStateSelected];
}

这仍然给我同样的问题。它肯定成功地将图像设置为默认状态,但是当我单击模拟器中的按钮时,图像仍然存在,而标题只是显示在它上面。

无论是在 GUI 还是以编程方式,我都可以获得不同的图像以显示在选定和禁用状态下。我所要做的就是添加:

[oneButton setBackgroundImage:anotherImage forState:UIControlStateSelected];

到循环和所有按钮在选择时显示其他图像。

我不能做的,也是让我发疯的,是试图让选择时没有背景图像,以便 UIButton 只显示标题...

编辑:

虽然不是一个理想的解决方案(我认为使用 UIButton 中的 imageView 属性可能会有所作为,但我不确定),但我想出了一种有点固定的方法来完成这项工作。

首先,我将正在使用的 UIImage 放入名为 cardBackImage 的类属性中。

然后,在每次对模型进行更改时循环遍历所有卡片按钮的 updateUI 函数中,我添加了这行代码:

[cardButton setBackgroundImage:(oneCard.isFaceUp ? nil : self.cardBackImage) forState:UIControlStateNormal];

因此,每次卡片对象“翻转”时,UIButton 都必须将 UIImage 加载或卸载到其实例变量中或从中取出。 Bleh...就像我说的,不理想,但它有效。

【问题讨论】:

  • 是你为选中状态分配1像素透明图片的好办法吗?
  • 这完全有可能,但我试图找出一些我可以在 XCode 中做的事情,而无需启动 Photoshop 或 GIMP。

标签: ios objective-c image uibutton title


【解决方案1】:

为什么不试试按钮的 image 属性而不是 backgroundImage 呢?当有图片时它会隐藏标题文本

UIButton *button;
[button setImage:[UIImage imageNamed:@"someImage"] forState:UIControlStateNormal];

【讨论】:

  • 我也试过了:使用 setImage 和 setBackgroundImage 的唯一区别是 setImage 完全隐藏了文本。
【解决方案2】:

我建议在按钮更改其状态(即被触摸)时简单地更改图像。我会写一个这样的方法:

- (void)swapBackgroundImagesOfButton:(UIButton *)button
{
    UIImage *normalImage = [button imageForState:UIControlStateNormal];
    UIImage *selectedImage = [button imageForState:UIControlStateSelected];

    [button setImage:selectedImage forState:UIControlStateNormal];
    [button setImage:normalImage forState:UIControlStateSelected];
}

然后,您无需设置按钮的selected 状态,而是在要显示或隐藏图像时调用该方法。

【讨论】:

  • 我可以在 viewDidLoad 函数中通过将两个不同的图像设置为两个不同的 UIControlStates 来做到这一点。但是,我想要的是在一个 UIControlState 中没有图像。
  • 我知道,上面的代码应该可以使用。您只需将 UIControlStateSelected 的图像最初设置为 nil
  • 这将比我想出的解决方案优雅得多,所以我只是尝试了一下。我将以下代码放入我的 viewDidLoad 函数中:[oneButton setImage:nil forState:UIControlStateSelected]; 什么也没做;当使用覆盖图像的标题属性选择该按钮时,该按钮仍显示背景图像。如果我不完全理解您的建议,请告诉我。
  • 我不确定。在您的 viewDidLoad 方法中,您应该像以前一样设置按钮。而在你的按钮的action方法中,你需要[self swapBackgroundImagesOfButton:sender];(用触摸的按钮替换sender
【解决方案3】:

这是一个更简单的解决方案,让您根据状态仅使用情节提要设置 UIButton 图像和标题。 在属性检查器中,您将按钮图像设置为默认状态,然后为所选状态设置按钮标题并为图像添加一个空格字符,如您所见

然后您可以通过self.button.isSelected = true 以编程方式更改状态并查看图像变成文本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多