[objective-c] UIButtons 배경색을 변경할 수 있습니까?

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

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

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



답변

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

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>

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

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


답변

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

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


답변

나는 당신이 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)가 필요하지 않습니다.


답변

또 다른 가능성 :

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

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

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

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


답변

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


답변

컬러 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;


답변

또 다른 가능성 (최고이자 가장 아름다운 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/ 에서 찾았습니다 ). 고마워 크리스!