【问题标题】:How to set the UIButton state to be highlighted after pressing it按下后如何设置UIButton状态高亮
【发布时间】:2011-11-05 23:58:25
【问题描述】:

我有一个典型的要求,我需要在按下按钮后保持按钮处于突出显示状态。我需要执行一项仅在按钮处于突出显示状态时才有效的任务。实际上,我正在以编程方式将按钮状态设置为突出显示。

[sender setHighlighted:YES];

一旦按钮处于突出显示状态,我需要执行另一个操作。

- (IBAction)changeState: (UIButton*)sender
{   
    if (sender.highlighted == YES)
    {
        [self performSomeAtion:sender];
    }
}

但是,令我恐惧的是,每当我按下任何按钮时,上述条件都会变为 true,并且该操作正在重复执行。有什么方法可以让 UIButton 的状态在按下后保持突出显示?

编辑 - 实际上我需要为按钮的 3 种不同状态执行 3 种不同的操作。我已经在使用选定状态和正常状态。现在,我需要利用高亮状态。

【问题讨论】:

  • 您可以设置一个 BOOL 变量,一旦执行操作,该变量将更新为 TRUE。
  • 但我需要将按钮设置为突出显示状态,除非我再次更改它,否则它必须保持突出显示状态..
  • 仅适用于 ios 7,您应该考虑将图像 renderMode 设置为 UIImageRenderingModeAlwaysTemplate,然后使用 Tint 颜色来表示各种状态。见stackoverflow.com/questions/19802982/apply-tintcolor-to-uiimage

标签: ios cocoa-touch uikit uibutton


【解决方案1】:

根据苹果的说法,UIButton 的属性是imageView

虽然这个属性是只读的,它自己的属性是读/写的。使用这些属性来配置按钮视图的外观和行为

这意味着您可以在 IB(在情节提要中)为此按钮设置图片并设置突出显示的图片:

  1. 打开属性检查器。
  2. 按钮部分下,选择一张图片。
  3. 在同一部分中,将 State Config 更改为 Highlighted。请注意,您在默认情况下选择的图像现在已经消失,现在您可以为突出显示设置新图片。
  4. 现在您有了一个带有 2 状态配置的按钮,您只需在运行时更改 button.highlighted = true。此外,请查看 Configuring the Control's Attributes 下的 UIControl 以了解更多状态。

您也可以通过以下方式进行编程:

Swift(在 Objective-C 中几乎相同):

// Setting the highlighted image
self.someButton.imageView?.highlightedImage = UIImage(named: "imageNameFromImageAssest")
// someButton will now some the highlighted image and NOT the image set in the IB
self.someButton.imageView?.highlighted = true

【讨论】:

    【解决方案2】:
    [sender setSelected:YES]; 
    

    或者您可以为您的 UIButton 使用两个图像(notselectedimage.pngselectedimage.png)模拟此效果,然后使用类似 BOOL buttonCurrentStatus; 的 BOOL 变量跟踪按钮状态。然后在.h文件中:

    BOOL buttonCurrentStatus;
    

    在.m文件中

    // connect this method with Touchupinside function
    - (IBAction)changeState:(UIButton*)sender
    {
        /* if we have multiple buttons, then we can
           differentiate them by tag value of button.*/
        // But note that you have to set the tag value before use this method.
    
      if([sender tag] == yourButtontag){
    
        if (buttonCurrentStatus == NO)
        {
            buttonCurrentStatus = YES;
            [butt setImage: [UIImage imageNamed:@"selectedImage.png"] forState:UIControlStateNormal];
            //[self performSomeAction:sender];
        }
        else
        {
            buttonCurrentStatus = NO;
            [butt setImage:[UIImage imageNamed:@"notSelectedImage.png"] forState:UIControlStateNormal];
            //[self performSomeAction:sender];
        }   
      }
    }
    

    【讨论】:

    • 感谢 vijay 的回答。如果我只有一个按钮,您的回答就可以正常工作。但我的情况有点复杂。我有多个按钮,应该为 3 个状态执行 3 个操作。有什么建议吗???也为你的答案 +1...
    • UISegmentControl 你知道。使用它。如果你需要更多帮助然后回复。mobisoftinfotech.com/blog/iphone/…
    • 如果您有多个按钮,您所要做的就是接受 Vijay 的回答并通过在您的按钮上添加 tags 来调整它,然后执行... UIButton *button = (UIButton*)sender; if (button.tag == 1) ...
    【解决方案3】:

    解决方案很棘手,但有可能。

    问题是您试图更改按钮操作方法中的突出显示状态,我想这会在操作结束时进行清理或检查过程并切换突出显示状态。当您尝试调试它时,您会得到突出显示的 = 1,但它会在最后发生变化。

    奇怪,但您的“3 种状态按钮”有时很有用,当您希望将按钮保持在“突出显示”模式(如“选择”模式)以根据 3 种状态获得不同的操作时。 唯一的问题是您无法在按钮操作方法中分析或将其切换到突出显示模式,因为当用户按下它并在最后将其切换回时,它将立即切换到突出显示模式。

    解决方案是使用调度。

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [theButton setHighlighted:YES];
    });
    

    这可以解决问题,您可以使用 3 种状态。

    【讨论】:

      【解决方案4】:

      仅适用于 iOS 7:您应该考虑将图像 renderMode 设置为 UIImageRenderingModeAlwaysTemplate。然后,您可以使用 tintColor 来表示各种状态。

      How to apply a tintColor to a UIImage?

      Tint a UIView with all its subviews

      【讨论】:

        【解决方案5】:
        - (void)mybutton:(id)sender
        {
            UIButton *button = (UIButton *)sender;
            button.selected = ![button isSelected]; // Important line
            if (button.selected)
            {
                NSLog(@"Selected");
                NSLog(@"%i",button.tag);
            }
            else
            {
                NSLog(@"Un Selected");
                NSLog(@"%i",button.tag);
        
            }
         }
        

        【讨论】:

          【解决方案6】:

          使用[sender setSelected: YES];,我觉得对你有用。

          【讨论】:

          • 就像我的问题中提到的那样,我需要使用按钮的突出显示状态而不是选定状态。
          • UIButton *btn_tmp=sender;if(!(btn_temp.selected)){//当按钮未选择时为真}
          【解决方案7】:

          我只是想办法,所以分享一下,以防万一……

          我保留了我的 UIButton 并为每个状态设置了一个图像(因此您最多可以使用 4 个状态按钮)。 我将 UserInteractionEnabled 设置为 NO -> 此按钮不会收到任何触摸。 第一个按钮的目的是显示一个状态

          我创建了第二个自定义 UIButton,其框架与第一个相同。对于这个,不会为状态设置任何图像(它是一个完全透明的按钮)。这个按钮的目的是捕捉触摸事件。所以我在 TouchUpInside 事件上为这个按钮添加了一个目标。然后当事件被触发时,我将第一个按钮的状态更改为禁用、突出显示、选择或没有这些状态(= 默认状态)。

          一切都像魅力一样运作!

          【讨论】:

            【解决方案8】:
            UIButton *btn_tmp=sender;
                if(!(btn_tmp.selected))
                {
            [btn_temp setHighlighted:YES];
            
            }
            

            【讨论】:

            • 我已将按钮设置为突出显示状态。但是,当我尝试检查按钮的状态时,我无法获得确切的状态。我想当我按下同一个按钮时,状态会从突出显示变为其他状态。有没有办法找到那个 narayana ?.
            【解决方案9】:

            按照你描述的方式,你最好继承 UIView 来创建你自己的三态按钮。

            实际上,您甚至应该实现自己的多状态 buttonView,并通过一组 PNG 的外观和一组状态来管理它在内部的状态,以了解它被按下了多少次。

            【讨论】:

              【解决方案10】:

              高亮状态用于在按钮被触摸时高亮显示。按钮中的触地事件突出显示它。您应该改用“选定”状态。

              如果您想要在按下按钮后执行操作,请不要将您的方法附加到状态更改事件,将您的方法附加到 TouchUpInside 事件。

              【讨论】:

              • +1 以获得很好的解释。实际上,我需要为按钮的 3 种不同状态执行 3 种不同的操作。这就是我陷入困境的地方。任何帮助将不胜感激(请检查我更新的问题)
              猜你喜欢
              • 2011-11-29
              • 2011-01-16
              • 2012-08-17
              • 2013-11-22
              • 2019-06-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多