UIButton:将图片设置为选中突出显示状态


158

我为按钮状态“正常”,“突出显示”和“选定”设置了图像,但是当按钮处于选定状态并按下/突出显示时,我看不到突出显示的图像,而只是看到灰色的图像。选择按钮时是否可以将图像设置为突出显示状态?

我的代码:

[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我有同样的问题,希望能有答案。
Nick Weaver

3
辉煌!谁会知道您可以为组合设置图像!对我来说就像一个魅力!
David H

1
太棒了!!! 您的问题本身就是对我的答案...有效!!!
Kiran S'8

1
它仅对UIControlStateHighlighted起作用,但我button.adjustsImageWhenHighlighted = NO;先调用。
Graham Perks

这个。比我以前的解决方案好得多。
Meshach 2013年

Answers:


231

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

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

5
通过接口生成器可以做到这一点吗?
Stephen

6
@stephen:为UIState的不同条件设置UIButton的“ Background”(图像)属性(默认/突出显示/选择/禁用)属性对我有用。
Ajeet

2
Ajeet的解决方案对我不起作用。我也想知道在IB上做这件事的一种方式
Lucas

3
由于您无法在IB中进行设置,因此可以将其放在viewDidLoad方法中,效果几乎一样好,因为您可以在IB中更改图像,而不必担心总是更新代码以匹配。[按钮setImage:[按钮imageForState:UIControlStateHighlighted] forState:UIControlStateSelected | UIControlStateHighlighted];
Dave Wood

4
可以在IB中做到这一点。查看以下答案中的屏幕截图!
Ríomhaire

121

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

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

在屏幕截图,我使用的是自定义按钮类型,但这并没有关系。

自定义默认

在此处输入图片说明

在此处输入图片说明


5
自定义或系统实际上很重要。一起玩,您会看到的。
Ben Sinclair 2014年

9
不在上下文中。
Ríomhaire

7
这不能回答问题。他说,突出显示+选择状态的组合
拉斐尔·诺布雷

+1是因为我完全错过了这些下拉菜单(我以前一直以编程方式来做所有事情,直到最近...)
Nicolas Miari 2015年

30

迅捷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:)

斯威夫特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
huggie

1
iOS 10将使您正常/选定的图像变暗,这很好而且看起来也不错。如果设置了选定的突出显示的图像,它将不会自动使后者变暗。真是可惜
snakeoil '16

28

我认为这里的大多数海报都完全忽略了这一点。我有同样的问题。最初的问题是有关“选定”按钮的“突出显示”状态(“合并两个状态”),该按钮无法在IB中设置,并随着变暗而回落到“默认”状态。提到的唯一可行的解​​决方案是:

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

我知道,但是我被以某种方式不允许
阿尔汉(Alghanor)2013年

1
由于某些原因,即使我将其设置为如上所述,我仍然会遇到问题。获取控件状态的自定义图像的唯一方法是仅设置UIControlStateHighlighted。
Julius

12

如果您有充分的理由这样做,那么就可以解决问题

添加以下目标:

[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];
}

谢谢这个,但是实际上它太复杂了)我希望按钮可以像上面描述的那样工作
user478681 2011年

7

在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))


2

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

   [button setSelected:YES];

您显然正在更改所选按钮的状态。因此,很自然地,通过您提供的代码,您的情况下选中状态的图像将被选中


不完全了解您的意思是“清除更改状态...”。这非常简单:我将图像设置为上述状态,为此按钮添加目标动作,并在处理我的动作的方法中(控制事件UIControlEventTouchUpInside),为按钮[button setSelected:YES / NO]切换选定状态。当按钮当前处于选定状态并按下/突出显示时,我只会看到灰色图像,就像该状态下没有图像设置一样。
user478681 2011年

我的意思很明显。抱歉 第一次按下按钮时,您将其状态设置为选中状态,以便显示图像。因此,如果只想获取突出显示的图像,请使其状态为突出显示。我不确定是否能正确处理您的
事宜

当我首先按下按钮时,我将其声明为突出显示状态,然后在释放时将选择状态(如在操作方法中设置的那样)。然后再按一次(按钮已处于选定状态),然后应将状态更改为突出显示,并且应该看到Pressed.png图像,但在这种情况下看不到它。
user478681 2011年

1

如果有人想知道这在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编写它的方法更加简洁。
jungledev '16

1

迅捷3+

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

要么

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

这意味着按钮当前处于selected状态,然后您触摸它以显示highlight状态。


0

我在设置时遇到问题imageView.highlighted = NO; (设置为“是”正常工作,并且图像更改为突出显示的图像)。

解决方案是打电话 [imageView setHighlighted:NO];

一切正常。


0

您想从哪里打电话

[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,但我对其进行了一些改进以提供完整的解决方案


0

Xamarin C#

由于某些原因,按位或操作不起作用

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);

0

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

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.