【问题标题】:UIButton as switchUIButton 作为开关
【发布时间】:2012-01-24 04:23:01
【问题描述】:

我正在尝试在 Xcode4 for iOS 中创建一个带有自定义图像的 push-on-push-off-like 按钮。 我使用的代码是

- (IBAction)btnAll:(id)sender
{
    UIButton *button = (UIButton *)sender;
    button.selected = !button.selected;
}

目前还可以。 但我的问题是,当我打开时,我按下它,然后它再次弹出,最后又打开。 该应用程序可以运行,但这确实很难看。

我首先将“突出显示”图像设置为打开。因此,当我突出显示该按钮时,它处于打开状态并且弹出到打开状态。这很好用。但是当我再次关闭它时,问题是一样的,在相反的方向。

我尝试输入该代码:

- (IBAction)btnAll:(id)sender
{
    UIButton *button = (UIButton *)sender;
    if(button.selected)
    {
        [button setImage[UIImage imageNamed@"off.png"] forState:UIControlStateHighlighted];
    }
    else
    {
        [button setImage[UIImage imageNamed@"on.png"] forState:UIControlStateHighlighted];
    }
    button.selected = !button.selected;
}

但只要button.selected = !button.selected 没有区别。 所以它不会做任何改变。

我还尝试在 »Touch Down« 上触发 IBAction,但您可以想象这会是多么令人沮丧。

有没有人解决这个问题? 有没有人也为那个苦恼过?

您好,非常感谢 朱利安

【问题讨论】:

    标签: iphone ios xcode uibutton switch-statement


    【解决方案1】:

    @Jim - 你什么时候切换 isSelected 状态? isHighlighted 每次按下都会被调用两次。我的 UIButton 开关的破解版本如下:-

    class ButtonSwitch: UIButton {
    
      override func sendAction(_ action: Selector, to target: Any?, for event: UIEvent?) {
        if allControlEvents == .touchUpInside {
          isSelected.toggle()
        }
        super.sendAction(action, to: target, for: event)
      }
    }
    

    【讨论】:

      【解决方案2】:

      创建两个按钮。

      将按钮放在一个上方。

      可以使用设计生成器中的自定义按钮选项设置默认和选定图像。

      -(void)firstButtonClicked {
      
      firstButton.hidden = YES;
      secondButton.hidden = NO;
      
      }
      
      -(void)secondButtonClicked {
      
      firstButton.hidden = NO;
      secondButton.hidden = YES;
      
      }
      

      【讨论】:

        【解决方案3】:

        我之前遇到过类似的问题,点击时按钮的工作有点奇怪。试试这个代码,让我知道它是否有效

            UIButton *button = (UIButton *)sender;
            if(button.selected)
            {
                [button setImage:[UIImage imageNamed:@"off.png"] forState:UIControlStateHighlighted];
                [button setImage:[UIImage imageNamed:@"off.png"] forState:UIControlStateSelected];
                [button setImage:[UIImage imageNamed:@"off.png"] forState:UIControlStateHighlighted | UIControlStateSelected];
            }
            else
            {
                [button setImage:[UIImage imageNamed:@"on.png"] forState:UIControlStateHighlighted];
                [button setImage:[UIImage imageNamed:@"on.png"] forState:UIControlStateSelected];
                [button setImage:[UIImage imageNamed:@"on.png"] forState:UIControlStateHighlighted | UIControlStateSelected];
            }
            button.selected = !button.selected;
        
            If (button.selected) {
              [button setImage:[UIImage imageNamed:@"on.png"] forState:UIControlStateNormal];
            } else {
              [button setImage:[UIImage imageNamed:@"off.png"] forState:UIControlStateNormal];
            }
        

        当您点击并按住按钮时,该状态实际上是突出显示和选定状态,因此您需要同时为突出显示和选定状态提供图像。

        【讨论】:

          【解决方案4】:

          同意 Jim,您的代码几乎不需要修改,如下所示...

          [button setImage[UIImage imageNamed@"off.png"] forState:UIControlStateNormal];
          [button setImage[UIImage imageNamed@"on.png"] forState:UIControlStateSelected];
          

          【讨论】:

          • 看起来你不同意@jim。你不需要交换图像。
          • @XJones:谢谢,我的错!我已经相应地更改了示例代码。
          【解决方案5】:

          不要手动切换图像,只需在 Interface Builder 中设置选定状态的图像,并在点击按钮时交换 selected 属性。

          【讨论】:

          • 在突出显示时停止按钮调整其图像也是值得的,因为在这种情况下不需要这样做。
          • 正如您在我的帖子中看到的那样,我只是尝试将其作为我最初问题的解决方案。所以主要问题仍然存在。我刚刚意识到,当我很短地点击按钮时,突出显示的图像消失了,原来的关闭状态图像再次出现,然后它弹出到“选定”状态。它接缝太慢了......
          • Sample Video. 在原来的 iPhone 硬件上看起来是一样的。
          猜你喜欢
          • 2010-12-14
          • 2015-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多