【问题标题】:Different images for highlighted UIButton state突出显示的 UIButton 状态的不同图像
【发布时间】:2012-04-17 14:50:15
【问题描述】:


我需要 2 个不同的图像来突出显示 UIButton 的状态。

我有这几行代码:

- (IBAction)buttonPressed:(id)sender
{
    UIImage *followImageHighlighted = [UIImage imageNamed:@"follow-hilite.png"];
    UIImage *unfollowImageHighlighted = [UIImage imageNamed:@"unfollow-hilite.png"];
    if ([sender isSelected]) {
        // set this image for the next time the button will pressed
        [sender setImage:unfollowImageHighlighted forState:UIControlStateHighlighted];
    } else {
        // set this image for the next time the button will pressed
        [sender setImage:followImageHighlighted forState:UIControlStateHighlighted];
    }
}

- (void)viewDidLoad
{
    // ...
    UIImage *followImage = [UIImage imageNamed:@"follow.png"];
    UIImage *unfollowImage = [UIImage imageNamed:@"unfollow.png"];
    [self.followButton setImage:followImage forState:UIControlStateNormal];
    [self.followButton setImage:unfollowImage forState:UIControlStateSelected];
}

问题是每次我按下按钮时,我都会看到突出显示的图像follow-hilite.png

我不能更改道路上按钮的突出显示图像吗?

我认为这是一个不好的限制,因为当按钮被选中(因此,“关注”)并且用户按下它时,他会看到默认图像,然后当它触摸图像时,图像是选定状态的图像,当网络操作完成后按钮图像正确切换到选中的那个。

想法?

编辑

- (IBAction)followButtonTapped:(id)sender
{
    BOOL isFollowed = [sender isSelected];
    NSString *urlString = isFollowed ? kUnfollowURL : kFollowURL;
    // operation [...]
    [self.followButton setSelected:(isFollowed) ? NO : YES];
    self.user.followed = !isFollowed;
}

我更好地解释了这个问题:

  • 默认状态下的按钮:白底黑字
  • 按钮处于选中状态:黑底白字

如果没有关注目标用户,则按钮处于默认状态,如果我尝试按下它,我会看到正确的突出显示图像。

但是如果目标用户被关注并且按钮处于选中状态,如果我尝试按下它(并按住手指),我会看到白色背景上带有黑色文本的按钮。这很丑陋,这是我的问题。

【问题讨论】:

  • 我不知道[sender isSelected] 是什么,但它只返回是。
  • 这是什么意思:“如果目标用户被关注”?
  • 如果视图显示的用户被我关注。
  • 太好了。这就是我正在寻找的应用程序条件。将在几分钟内编辑我的答案。
  • @danh 我已经解决了,检查我的答案。还是谢谢你!

标签: iphone objective-c cocoa-touch uibutton


【解决方案1】:

IBAction 是一个尴尬的(充其量是,或不可能)配置控件的地方。您的应用程序中必须有一些条件会触发对不同突出显示图像的要求。当您检测到该情况时配置按钮。

使用“按下”回调来执行应用在按下时应该采取的任何操作。

【讨论】:

  • 如何配置按钮?条件是用户在按钮内部触摸。
  • 我正在寻找使您想要拥有不同的高亮图像的条件。触摸是使按钮想要显示其 当前 突出显示图像的原因。该按钮将在没有您帮助的情况下执行此操作。您要做的是根据一些应用程序条件预先设置正确的。
  • @dahn 是的,但在我开始之前,我认为这是 iOS 程序员的经典场景。不过好像还没有解决办法。
  • 可能是这样。我的猜测是您有一个关注和取消关注功能,并且您希望同一个按钮来执行这两个功能。这是很常见的。如果是这种情况,请告诉我,我将向您展示一些代码。 (顺便说一下,如果是这样的话,那么我要找的应用条件就是用户当前是否在关注某事)。
【解决方案2】:

我已经解决了:

[myButton setImage:imageSelectedHover forState:(UIControlStateSelected | UIControlStateHighlighted)];

【讨论】:

    【解决方案3】:

    很高兴它有效。您通过更新应用程序条件解决了它:self.user.followed。现在,为了让它真正正确,试试这个:

    - (IBAction)followButtonTapped:(id)sender
    {
        NSString *urlString = self.user.followed? kUnfollowURL : kFollowURL;
        // operation [...]
        self.user.followed = !self.user.followed;
    }
    

    模型的状态在这里很重要。按钮的选定状态更像是一个布尔值,它位于您保存真实以下状态副本的位置。

    【讨论】:

      【解决方案4】:

      我认为您需要在尝试修改任何重要内容并计算变量之前将 sender 强制转换为 UIButton*,因为 sender 包含名为的方法或属性-isSelected。试试这个:

      - (IBAction)buttonPressed:(id)sender
      {
          UIImage *followImageHighlighted = [UIImage imageNamed:@"follow-hilite.png"];
          UIImage *unfollowImageHighlighted = [UIImage imageNamed:@"unfollow-hilite.png"];
          if ([self isSelected]) {
              // set this image for the next time the button will pressed
              [(UIButton*)sender setImage:unfollowImageHighlighted forState:UIControlStateHighlighted];
          } else {
              // set this image for the next time the button will pressed
              [(UIButton*)sender setImage:followImageHighlighted forState:UIControlStateHighlighted];
          }
      [self isSelected] = ![self isSelected];
      }
      

      【讨论】:

      • 演员阵容是正确的风格,但不会有所作为。
      • 他也没有改变他的 isSelected 变量,我认为这就是他的问题所在。这就是我添加最后一行的原因。
      • 问题是选中状态(以及高亮状态)是基于触发动作的控制事件而固定的。对于给定的控制事件,代码将始终运行相同的路径。 @Fred 需要确定一个应用条件,使他想要更改图像,然后在新闻开始之前进行更改。
      • 我想我们在这里互相交谈。 @Fred 这里想要更改 touchUpInside 上突出显示状态的图像。这似乎很合理,为什么你会认为该属性是不可变的?
      • 不是一成不变的,而是另外两个问题(对不起,我表达得不够清楚):(1)取决于控制事件,可能为时已晚 - 例如在 touchUpInside 上,高亮显示在您获得 IBAction 时已显示,并且 (2) 控制事件将导致选定状态为某个值,对于给定的 IBAction,它将是相同的值。分支没有意义,因为分支将始终以相同的方式运行。即在您提供的条件的两个分支中都设置一个断点...我声称*(现在不太自信)您永远不会碰到其中一个。
      猜你喜欢
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      相关资源
      最近更新 更多