UIButton:为选中状态设置图片

Posted

技术标签:

【中文标题】UIButton:为选中状态设置图片【英文标题】:UIButton: set image for selected-highlighted state 【发布时间】:2011-08-01 08:21:42 【问题描述】:

我为按钮的状态 Normal、Highlighted 和 Selected 设置了图像,但是当按钮处于选定状态并按下/突出显示它时,我没有看到突出显示的图像,而只是看到灰色的图片。 选择按钮时是否可以设置图像为高亮状态?

我的代码:

[button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateHighlighted];
[button setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateSelected];

当我这样做时:

[button setSelected:YES];

然后按下按钮,“pressed.png”图像不会被选中。

【问题讨论】:

+1 我也有同样的问题,希望有答案。 太棒了!谁会知道您可以为组合设置图像!对我来说就像一个魅力! 太棒了!!!你的问题本身就是我的答案......它有效!!! 它只适用于 UIControlStateHighlighted,但我首先调用 button.adjustsImageWhenHighlighted = NO; 这个。比我以前的解决方案好多了。 【参考方案1】:

我找到了解决方案:需要添加添加行

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];

【讨论】:

有什么方法可以通过界面生成器做到这一点? @stephen:设置 UIButton 的“Background”(image) 属性以适应“StateConfig”(Default/Highlighted/Selected/Disabled) 属性的不同条件。 Ajeet 的解决方案对我不起作用。我也想知道在 IB 上这样做的方法 因为你不能在 IB 中设置这个,你可以把它放在你的 viewDidLoad 方法中,它几乎一样好,因为你可以在 IB 中更改图像而不必担心关于始终更新代码以匹配。 [button setImage:[button imageForState:UIControlStateHighlighted] forState:UIControlStateSelected | UIControlStateHighlighted]; 可以在 IB 中做到这一点。请参阅以下答案中的屏幕截图!【参考方案2】:

您可以在 Interface Builder 中执行此操作。

IB中选择您要设置的UIButton,然后转到attributes inspector

在屏幕截图中,我使用的是自定义按钮类型,但这很重要。

【讨论】:

自定义或系统实际上很重要。玩弄两者,你会看到的。 不在问题的上下文中。 这没有回答问题。他说高亮+选中状态的组合 +1 因为我完全错过了这些下拉菜单(直到最近我都以编程方式完成所有操作......)【参考方案3】:

斯威夫特 3

// Default state (previously `.Normal`)
button.setImage(UIImage(named: "image1"), for: [])

// Highlighted
button.setImage(UIImage(named: "image2"), for: .highlighted)

// Selected
button.setImage(UIImage(named: "image3"), for: .selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), for: [.selected, .highlighted])

设置背景图片我们可以使用setBackgroundImage(_:for:)

Swift 2.x

// Normal
button.setImage(UIImage(named: "image1"), forState: .Normal)

// Highlighted
button.setImage(UIImage(named: "image2"), forState: .Highlighted)

// Selected
button.setImage(UIImage(named: "image3"), forState: .Selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), forState: [.Selected, .Highlighted])

【讨论】:

数组版本对我不起作用。 (至少在setImage 期间) ios 10 将使您的正常/选定图像变暗,这很好,看起来也不错。如果您设置选定的突出显示的图像,它不会自动使后者变暗。这是一个无赖。【参考方案4】:

我认为这里的大多数海报完全没有抓住重点。我有同样的问题。最初的问题是关于选定按钮的突出显示状态(结合两种状态),它不能在 IB 中设置,并且会随着一些变暗而回退到默认状态。只有一篇文章提到的有效解决方案:

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];

【讨论】:

我知道,但不知何故我不被允许 出于某种原因,即使我按上述方式设置,我仍然会遇到问题。为我的控件状态获取自定义图像的唯一方法是仅设置 UIControlStateHighlighted。【参考方案5】:

如果你有充分的理由这样做,这会成功

添加这些目标:

[button addTarget:self action:@selector(buttonTouchDown:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(buttonTouchUp:) forControlEvents:UIControlEventTouchUpInside];


-(void)buttonTouchDown:(id)sender
    UIButton *button=(UIButton *)sender;
    if(button.selected)
        [button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateNormal];
    


-(void)buttonTouchUp:(id)sender
    UIButton *button=(UIButton *)sender;
    [button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];

【讨论】:

谢谢你,但实际上它太复杂了)我希望按钮能像上面描述的那样工作【参考方案6】:

在 Swift 3.x 中,您可以通过以下方式设置选择按钮时突出显示的图像:

// Normal state
button.setImage(UIImage(named: "normalImage"), for: .normal) 

// Highlighted state (before button is selected)
button.setImage(UIImage(named: "pressedImage"), for: .highlighted)

// Selected state
button.setImage(UIImage(named: "selectedImage"), for:  .selected)

// Highlighted state (after button is selected)
button.setImage(UIImage(named: "pressedAfterBeingSelectedImage"), 
                for:  UIControlState.selected.union(.highlighted))

【讨论】:

【参考方案7】:

你可以迅速做到:

button.setImage(UIImage(named: "selected"), 
                forState: UIControlState.selected.union(.highlighted))

【讨论】:

【参考方案8】:

如果我错了,请纠正我。通过做

   [button setSelected:YES];

您显然正在更改所选按钮的状态。所以很自然地,通过您提供的代码,图像将在您的案例中为所选状态检查。png

【讨论】:

不完全理解“清除更改状态...”是什么意思。这很简单:我为上述状态设置图像,为此按钮添加目标操作,并在处理我的操作的方法中(控制事件 UIControlEventTouchUpInside)我切换按钮的选定状态 [按钮 setSelected:YES/NO]。当按钮当前处于选定状态并且我按下/突出显示它时,我只看到灰色的图像,就像这个状态没有图像设置一样。 我的意思很清楚。对此感到抱歉。当您第一次按下按钮时,您将其状态设置为选中,以便显示图像。因此,如果您只想获得突出显示的图像,请将其状态设置为突出显示。我不确定我是否正确地得到了你 当我首先按下按钮时,我将其声明为突出显示,然后当我释放它时,将选择该状态(正如我在我的操作方法中设置的那样)。比我再次按下它(按钮已经处于选定状态)并且状态应该更改为突出显示并且我应该看到pressed.png图像但在这种情况下我看不到它。【参考方案9】:

就我而言,我必须将 UIButton.Type 从 .custom 更改为 .system

还有:

button.setImage(UIImage(named: "unchecked"), for: .normal)
button.setImage(UIImage(named: "checked"), for: [.selected, .highlighted])

处理敲击时:

button.isSelected = !button.isSelected

【讨论】:

【参考方案10】:

如果有人想知道这在 Swift 中是如何工作的,这是我的解决方案:

button.setImage("normal.png", forState: .Normal)
button.setImage("highlighted.png", forState: .Highlighted)
button.setImage("selected.png", forState: .Selected)

var selectedHighLightedStates: UIControlState = UIControlState.Highlighted
selectedHighLightedStates = selectedHighLightedStates.union(UIControlState.Selected)
button.setImage("selectedHighlighted.png", forState: selectedHighLightedStates)

【讨论】:

@basegod 这是一个可行的解决方案,但 Roland Keesom 编写它的方式要简洁得多。【参考方案11】:

斯威夫特 3+

button.setImage(UIImage(named: "selected_image"), for: [.selected, .highlighted])

button.setImage(UIImage(named: "selected_image"), for: UIControlState.selected.union(.highlighted))

表示按钮当前处于selected状态,然后你触摸它,显示highlight状态。

【讨论】:

【参考方案12】:

我在设置imageView.highlighted = NO; 时遇到问题 (设置 YES 正常工作,图像变为突出显示的图像)。

解决方案是调用[imageView setHighlighted:NO];

一切正常。

【讨论】:

【参考方案13】:

你想从哪里打电话

[button addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];

方法:

-(void)test:(id)sender
    UIButton *button=(UIButton *)sender;
    if (_togon)
      [button setTitleColor:UIColorFromRGB(89,89, 89) forState:UIControlStateNormal];
      _togon=NO;
    
    else
      [button setTitleColor:UIColorFromRGB(28, 154, 214) forState:UIControlStateNormal];
      _togon=YES;
    

以上归功于 Jorge,但我对其进行了一些改进,提供了完整的工作解决方案

【讨论】:

【参考方案14】:

Xamarin C#

由于某种原因,按位 OR 不起作用

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected | UIControlState.Highlighted | UIControlState.Focused);

以下作品

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Highlighted);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Focused);

【讨论】:

【参考方案15】:

如果您还需要在您点击并按住所选状态的自定义按钮时操作系统默认提供的突出显示色调,请使用此 UIButton 子类。用 Swift 5 编写:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton 
    override var isHighlighted: Bool 
        didSet 
            if (self.isSelected != isHighlighted) 
                self.isHighlighted = self.isSelected
            
        
    

【讨论】:

以上是关于UIButton:为选中状态设置图片的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式为处于触摸状态的 UIButton 创建灰色叠加层?

UIButton 系统样式选中状态,保留图片和背景

在 UITapGestureRecognizer(双击)添加到 UIButton 会减慢将按钮图像设置为选中状态

UIButton的背景图片

iOS UIButton 选中状态

向下滚动时如何使 UIButton 在表格视图中保持选中状态