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

1
UIControlStateHighlighted로만 작동하지만 button.adjustsImageWhenHighlighted = NO;먼저 전화하십시오 .
Graham Perks

이. 내가 이전에했던 솔루션보다 훨씬 낫습니다.
Meshach

답변:


231

해결책을 찾았습니다 : 추가 라인을 추가해야합니다.

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

5
인터페이스 빌더를 통해이를 수행 할 수있는 방법이 있습니까?
Stephen

6
@ stephen : "StateConfig"(기본 / 강조 표시 / 선택 / 비활성화) 속성의 다른 조건에 대해 UIButton의 "배경"(이미지) 속성을 설정하면 효과가 있습니다.
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

9
질문과 관련이 없습니다.
Ríomhaire 2016 년

7
이것은 질문에 대답하지 않습니다. 그는 강조된 + 선택된 상태의 조합
Rafael Nobre

+1 풀다운 메뉴를 완전히 놓 쳤기 때문에 +1 (최근까지 프로그래밍 방식으로 모든 작업을 수행 했었습니다 ...)
Nicolas Miari

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

28

나는 대부분의 포스터가 그 요점을 완전히 놓치고 있다고 생각합니다. 나는 같은 문제가 있었다. 원래 질문은 IB에서 설정할 수없고 일부 어두워 짐과 함께 기본 상태로 돌아가는 선택된 버튼 (COMBINING BOTH STATES)의 강조 표시된 상태에 관한 것이 었습니다. 한 게시물로만 작동하는 솔루션 :

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

알지만 난 어떻게 든 허용되지 않았다
alghanor

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

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

7

신속하게 당신은 할 수 있습니다 :

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

2

내가 틀렸다면 나를 바로 잡으십시오. 함으로써

   [button setSelected:YES];

선택한 버튼의 상태를 명확하게 변경하고 있습니다. 따라서 자연스럽게 당신이 제공 한 코드에 의해 이미지는 귀하의 경우 선택된 상태에 대한 것입니다 .png


"상태 변경 지우기 ..."가 무슨 뜻인지 완전히 이해하지 못합니다. 이것은 매우 간단합니다. 위에서 설명한 상태에 대한 이미지를 설정하고이 단추에 대한 대상 동작을 추가하고 내 동작 (제어 이벤트 UIControlEventTouchUpInside)을 처리하는 방법에서 [button setSelected : YES / NO] 버튼의 선택된 상태를 토글합니다. 그리고 현재 선택된 상태의 버튼을 누르고 강조 표시하면이 상태에 대한 이미지 설정이없는 것처럼 회색 이미지 만 보입니다.
user478681

나는 분명히 거기에 의미했다. 그 죄송합니다. 버튼을 먼저 누르면 상태가 선택된대로 설정되어 이미지가 표시됩니다. 따라서 강조 표시된 이미지 만 얻으려면 강조 표시된 상태로 만드십시오. 나는 당신을 제대로 받고 있는지 확실하지 않습니다
visakh7

버튼을 먼저 누르면 강조 표시 된 상태로 표시되고 버튼을 놓으면 상태가 선택됩니다 (작업 방법에서 설정 한대로). 다시 누르면 (이미 선택된 상태의 버튼) 상태가 강조 표시로 바뀌어야하는데 pressed.png 이미지가 표시되지만이 경우에는 표시되지 않습니다.
user478681

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

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 #

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

0

선택한 상태에 대한 사용자 정의 버튼을 누르고있을 때 OS가 기본적으로 제공하는 강조 표시된 색조가 필요한 경우이 UIButton 서브 클래스를 사용하십시오. 스위프트 5로 작성 :

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.