UIButtons 배경색을 변경할 수 있습니까?


105

이것은 나를 어리둥절하게 만듭니다.

iPhone 용 Cocoa에서 UIButton의 배경색을 변경할 수 있습니까? 배경색 설정을 시도했지만 모서리 만 변경합니다. setBackgroundColor:그런 일에 사용할 수있는 유일한 방법 인 것 같습니다.

[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];

이미지를 수정하거나 제거 할 수 있습니까? kthx;)
stigi

o-0 흠 ....., 이미지는 괜찮 았지만 이제는 더 이상 표시되지 않습니다. 방금 삭제했습니다
dubbeat


이전 게시물에서이 문제를 해결했습니다. [UIButton의 테두리 또는 배경을 동적으로 변경] [1] [1] : stackoverflow.com/questions/9733213/…
IMMORTAL

좋은 튜토리얼과 샘플 코드는 여기 cimgf.com/2010/01/28/…
Shamsudheen TK

답변:


160

이것은 복제본을 만들어 프로그래밍 방식으로 수행 할 수 있습니다.

loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
[loginButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
loginButton.backgroundColor = [UIColor whiteColor];
loginButton.layer.borderColor = [UIColor blackColor].CGColor;
loginButton.layer.borderWidth = 0.5f;
loginButton.layer.cornerRadius = 10.0f;

편집 : 물론, 당신은 #import <QuartzCore/QuartzCore.h>

편집 : 모든 새로운 독자에게 "다른 가능성"으로 추가 된 몇 가지 옵션도 고려해야합니다. 당신을 위해 고려하십시오.

이것은 오래된 답변이므로 문제 해결을 위해 의견을 읽는 것이 좋습니다.


이것이 OP가 찾고있는 것입니다.
스티븐

4
단! 내가 찾은 모든 솔루션 중에서 이것이 내가 함께 갔던 것입니다. 명확하게 말하자면, '복제본'을 만드는 것은 RoundedRect 유형 버튼을 사용하는 대신 Quartz를 사용하여 사용자 정의 버튼에 둥근 사각형을 그리는 것을 의미합니다. 처음에는 bg 색상 변경을 시뮬레이션하기 위해 다른 색상으로 둥근 사각형을 복제하는 것을 의미한다고 생각했습니다.
daver

1
완벽하게 작동했으며 OP에 대한 최고의 답변입니다. 공유해 주셔서 감사합니다.
Bram

@daver :이 답변은 너무 유명해서 내가 놓치고있는 장점이 있어야합니다. 상태에 따라 배경색을 어떻게 바꿀 수 있습니까? 아마도 상태가 변경 될 때마다 배경색을 명시 적으로 변경해야합니다. 웹 서비스가 응답 할 때까지 누르면 내 버튼이 비활성화됩니다. 프레스에서 하이라이트 색상으로 변경하고 ws가 응답하기를 기다리는 동안 타이머를 비활성화 된 색상으로 변경해야합니까? 내가 요점을 놓치고 있다면 누군가 설명해 주시겠습니까? 감사합니다 폴리.
Polly

1
@Polly : 죄송합니다. 귀하의 의견을 더 일찍 보지 못했지만 여전히 관심이 있으시다면 UIButton 하위 클래스를 만들고 drawRect를 재정 의하여 UIBezierPath를 사용하여 둥근 사각형을 그립니다. 그린 후 CGGradientCreateWithColorComponents ()를 사용하여 그라디언트로 채 웁니다. 이 함수의 인수 중 하나는 부동 소수점의 4 요소 배열입니다 (R, G, B, 알파에 해당). 각 상태에 대해 하나씩 2 개의 색상 배열을 정의하고 버튼 상태에 따라 drawRect에서 적절한 것을 선택했습니다.
daver

59

저는 다른 접근 방식이 있습니다.

[btFind setTitle:NSLocalizedString(@"Find", @"") forState:UIControlStateNormal];    
[btFind setBackgroundImage:[CommonUIUtility imageFromColor:[UIColor cyanColor]] 
        forState:UIControlStateNormal];
btFind.layer.cornerRadius = 8.0;
btFind.layer.masksToBounds = YES;
btFind.layer.borderColor = [UIColor lightGrayColor].CGColor;
btFind.layer.borderWidth = 1;

CommonUIUtility에서

+ (UIImage *) imageFromColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    //  [[UIColor colorWithRed:222./255 green:227./255 blue: 229./255 alpha:1] CGColor]) ;
    CGContextFillRect(context, rect);
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

잊지 마세요 #import <QuartzCore/QuartzCore.h>


2
멋지네요. 추가해야한다는 것을 알았습니다btFind.layer.borderWidth = 1;
DefenestrationDay

이 솔루션이 마음에 들지만 지금은 사용할 수 없습니다. "CommonUIUtility"를 찾을 수 없기 때문에 오류가 발생합니다. Google은 이클립스를 제공하지만 QuartzCore에 있어야한다고 생각합니까? 어떤 아이디어?
Stephan

아니요, 앱에서 일반적인 UI 작업을 수행하기위한 사용자 정의 클래스입니다. 자신의 클래스에서 imageFromColor 메서드를 작성합니다.
karim

1
UIButton :에서 카테고리 메소드와 같은 냄새가납니다 setBackgroundColor:(UIColor *) forState:(UIControlState).
EthanB 2013-08-20

3
너무 어리석어 서 iOS 7을 사용하고 있으며 여전히 배경색을 추가하는 가장 깨끗한 방법입니다
dmur

32

나는 당신이 UIButton에 대해 이야기하고 있다고 가정합니다 UIButtonTypeRoundedRect. 그 배경색은 변경할 수 없습니다. 배경색을 변경하려고 할 때 버튼이 그려지는 사각형의 색상을 변경하는 것입니다 (일반적으로 명확함). 그래서 두 가지 방법이 있습니다. UIButton을 하위 클래스로 -drawRect:만들고 해당 메서드를 덮어 쓰거나 다른 버튼 상태에 대한 이미지를 생성합니다 (완벽하게 수행 할 수 있음).

Interface Builder에서 배경 이미지를 설정하면 IB가 버튼이 가질 수있는 모든 상태에 대한 이미지 설정을 지원하지 않는다는 점을 알 수 있으므로 다음과 같이 코드에서 이미지를 설정하는 것이 좋습니다.

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setBackgroundImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[myButton setBackgroundImage:[UIImage imageNamed:@"disabled.png"] forState:UIControlStateDisabled];
[myButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
[myButton setBackgroundImage:[UIImage imageNamed:@"higligted.png"] forState:UIControlStateHighlighted];
[myButton setBackgroundImage:[UIImage imageNamed:@"highlighted+selected.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)];

마지막 줄은 선택 및 강조 표시된 상태 (IB가 설정할 수없는 상태)에 대한 이미지를 설정하는 방법을 보여줍니다. 선택한 상태가 필요하지 않은 경우에는 선택한 이미지 (라인 4 및 6)가 필요하지 않습니다.


설명해 주셔서 감사합니다. 간단한 질문입니다. drawrect 메서드를 덮어 쓰면 드로잉 라이브러리를 사용하게 될 것 같습니까? 프로그래밍 방식으로 둥근 사각형을 그리고 색으로 채우는 선만 있는가?
dubbeat

2
방금 "iphone drawrect round corners"에 대한 짧은 Google 쿼리를 수행 한 결과 다음이 발견되었습니다. iphonedevelopment.blogspot.com/2008/11/… round rect를 그리는 방법에 대한 예제는 drawrect 메서드를 확인하십시오. 당신은 사용할 수 있습니다 CGContextSetFillColorWithColorCGContextFillPath의해 그려진 경로를 채우기 위해 CGContextAddArcToPoint.
stigi

2
제어 상태에 대한 비트 마스킹 가능성을 지적하는 경우 +50, 즉 : forState:(UIControlStateHighlighted | UIControlStateSelected)Cheers.
NSTJ 2014 년

28

또 다른 가능성 :

  1. 인터페이스 빌더에서 UIButton을 작성하십시오.
  2. 'Custom'유형을 지정하십시오.
  3. 이제 IB에서는 배경색을 변경할 수 있습니다.

그러나 버튼은 정사각형이며 우리가 원하는 것은 아닙니다. 이 버튼에 대한 참조를 사용하여 IBOutlet을 만들고 viewDidLoad 메서드에 다음을 추가합니다.

[buttonOutlet.layer setCornerRadius:7.0f];
[buttonOutlet.layer setClipToBounds:YES];

QuartzCore.h를 가져 오는 것을 잊지 마세요.


7
완벽합니다, 감사합니다! 사용중인 iOS 버전 (5.1) 때문인지 확실하지 않지만 setClipToBounds를 사용할 수 없습니다. 대신 buttonOutlet.layer.masksToBounds = TRUE를 사용했습니다.
iforce2d

이 코드를 추가하면 둥근 사각형이 표시되지만 클릭하면 버튼이 반전되지 않습니다. 무슨 일이야?
Will

이 접근 방식의 문제점은 버튼의 강조 표시된 상태에 배경색을 설정할 수 없다는 것입니다.
ch3rryc0ke 2013-06-25

17

UIButton을 하위 클래스로 만들고 setHighlighted 및 setSelected 메서드를 재정의합니다.

-(void) setHighlighted:(BOOL)highlighted {

  if(highlighted) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setHighlighted:highlighted];
}

-(void) setSelected:(BOOL)selected {

  if(selected) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setSelected:selected];
}

내 darkerShade 메서드는 다음과 같은 UIColor 범주에 있습니다.

-(UIColor*) darkerShade {

  float red, green, blue, alpha;
  [self getRed:&red green:&green blue:&blue alpha:&alpha];

  double multiplier = 0.8f;
  return [UIColor colorWithRed:red * multiplier green:green * multiplier blue:blue*multiplier alpha:alpha];
}

7

컬러 UIButton

이미지를 사용하고 싶지 않고 Rounded Rect 스타일과 똑같이 보이기를 원한다면 이것을 시도하십시오. 동일한 프레임과 자동 크기 조정 마스크를 사용하여 UIButton 위에 UIView를 놓고 알파를 0.3으로 설정하고 배경을 색상으로 설정하면됩니다. 그런 다음 아래 스 니펫을 사용하여 컬러 오버레이보기에서 둥근 가장자리를 잘라냅니다. 또한 UIView의 IB에서 'User Interaction Enabled'확인란을 선택 취소하여 터치 이벤트가 아래의 UIButton으로 계단식으로 내려가도록합니다.

한 가지 부작용은 텍스트도 색상 화된다는 것입니다.

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;

7

또 다른 가능성 (최고이자 가장 아름다운 imho) :

Interface Builder에서 필요한 배경색으로 2 개의 세그먼트로 UISegmentedControl을 만듭니다. 유형을 'bar'로 설정합니다. 그런 다음 세그먼트가 하나만 있도록 변경하십시오. 인터페이스 빌더는 하나의 세그먼트를 허용하지 않으므로 프로그래밍 방식으로 수행해야합니다.

따라서이 버튼에 대한 IBOutlet을 만들고이를 뷰의 viewDidLoad에 추가합니다.

[segmentedButton removeSegmentAtIndex:1 animated:NO];

이제 지정된 배경색을 가진 아름다운 광택 컬러 버튼이 생겼습니다. 조치의 경우 '값 변경'이벤트를 사용하십시오.

( http://chris-software.com/index.php/2009/05/13/creating-a-nice-glass-buttons/ 에서 찾았습니다 ). 고마워 크리스!


5

글쎄요, 저는 당신이 UIButton의 배경색을 바꿀 수 없다고 99 % 확신합니다. 대신 내가 고통스러워하는 배경 이미지를 직접 변경해야합니다. 이 일을해야해서 놀랐습니다.

내가 틀렸거나 배경 이미지를 설정하지 않고 더 나은 방법이 있다면 알려주십시오.

[random setBackgroundImage:[UIImage imageNamed:@"toggleoff.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal];


[random setBackgroundImage:[UIImage imageNamed:@"toggleon.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

5
당신이 절대적으로 옳습니다. 그것은 고통스럽고 이미지를 만드는 번거 로움 대신 몇 분이 걸릴 것입니다. 게다가 버튼이 둥글면하기도 더 어려워집니다.
Henley Chiu 2011 년

2

@EthanB 제안과 @karim이 다시 채워진 사각형을 만드는 것에 따라, 나는 이것을 달성하기 위해 UIButton에 대한 카테고리를 방금 만들었습니다.

카테고리 코드 : https://github.com/zmonteca/UIButton-PLColor

용법:

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

사용할 상태 :

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected

2

버튼에 CALayer를 추가 할 수도 있습니다. 색상 오버레이를 포함하여 많은 작업을 수행 할 수 있습니다.이 예제에서는 일반 색상 레이어를 사용하여 쉽게 색상을 조정할 수 있습니다. 추가 된 레이어가 아래에있는 레이어를 가리지 만주의

+(void)makeButtonColored:(UIButton*)button color1:(UIColor*) color
{

    CALayer *layer = button.layer;
    layer.cornerRadius = 8.0f;
    layer.masksToBounds = YES;
    layer.borderWidth = 4.0f;
    layer.opacity = .3;//
    layer.borderColor = [UIColor colorWithWhite:0.4f alpha:0.2f].CGColor;

    CAGradientLayer *colorLayer = [CAGradientLayer layer];
    colorLayer.cornerRadius = 8.0f;
    colorLayer.frame = button.layer.bounds;
    //set gradient colors
    colorLayer.colors = [NSArray arrayWithObjects:
                         (id) color.CGColor,
                         (id) color.CGColor,
                         nil];

    //set gradient locations
    colorLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];


    [button.layer addSublayer:colorLayer];

}

훌륭한!!!!!! 그러나 동일한 버튼에 대해 여러 번 호출 할 수 없습니다. 가능하지만 새 레이어가 계속 추가됩니다.
Valeriy Van

@StanJames : 코드 편집은 주석 (또는 적절한 경우 자체 답변)으로 제안해야합니다.
mafso

1

for에 UIButton대한 두 번째 대상을 추가하고 배경색을 UIControlEventTouched변경합니다 UIButton. 그런 다음 UIControlEventTouchUpInside대상 에서 다시 변경하십시오 .


1

전문적이고 멋진 버튼의 경우이 맞춤 버튼 구성 요소를 확인할 수 있습니다 . 뷰 및 테이블 뷰에서 직접 사용하거나 필요에 맞게 소스 코드를 수정할 수 있습니다. 도움이 되었기를 바랍니다.


1

이것은 하위 클래스 UIButton만큼 우아하지는 않지만 빠르게 원하는 경우 사용자 정의 버튼을 만든 다음 버튼이 원하는 색상의 1px x 1px 이미지를 만들고 배경을 설정했습니다. 강조 표시된 상태에 대한 해당 이미지에 버튼의-내 필요에 맞게 작동합니다.


1

나는 이것이 오래 전에 요청되었고 이제 새로운 UIButtonTypeSystem이 있다는 것을 알고 있습니다. 그러나 새로운 질문은이 질문의 중복으로 표시되므로 여기에 iOS 7 시스템 버튼의 맥락에서 새로운 답변이 .tintColor있습니다. 속성을 사용하십시오 .

let button = UIButton(type: .System)
button.setTitle("My Button", forState: .Normal)
button.tintColor = .redColor()

0

[myButton setBackgroundColor:[UIColor blueColor]]; [myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

이 방법으로 변경하거나 스토리 보드에서 오른쪽 옵션의 배경을 변경할 수 있습니다.


0

스위프트 3 :

        static func imageFromColor(color: UIColor, width: CGFloat, height: CGFloat) -> UIImage {
            let rect = CGRect(x: 0, y: 0, width: width, height: height)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()!
            context.setFillColor(color.cgColor)
            context.fill(rect)
            let img = UIGraphicsGetImageFromCurrentImageContext()!
            UIGraphicsEndImageContext()
            return img
        }

        let button = UIButton(type: .system)
        let image = imageFromColor(color: .red, width: 
        button.frame.size.width, height: button.frame.size.height)
        button.setBackgroundImage(image, for: .normal)

당신이 거기에 넣은 코드를 호출하거나 사용하는 방법을 말하면 훨씬 더 유용한 대답이 될 것입니다. UIButton 확장에 들어가나요?
마이클 Dautermann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.