2011-12-14 4 views
1

이전에이 질문에 많은 변형이 있었지만 특정 문제가 발생하지 않는 것으로 알고 있습니다. 나는 iOS 개발과 Objective-C에 익숙하지 않으므로,이 부분이 특히 기본적인 부분이라면 저와 함께하시기 바랍니다.UIVIew의 배경색 설정이 실패했습니다.

나는 동적으로 내가 쉽게 같은 문장을 통해 배경 색상을 변경할 수 있습니다 뷰 (는 단일보기 응용 프로그램입니다.)의 배경 색상 변경하기 위해 노력하고있어 :

[self.view setBackgroundColor:[UIColor blueColor]]; 

또는

UIColor *newColor = [[UIColor alloc] initWithRed:.777777 green:.777777 blue:.777777 alpha:.777777]; 
[self.view setBackgroundColor:newColor]; 

이러한 RGBA 값 중 하나를 동적으로 변경하려고하면 문제가 발생합니다 (이 경우 슬라이더 사용).이 메서드를 통해 4 개의 슬라이더 (태그 0-3 포함)가

I에 슬라이더를 이동하면, I는 값 NSLog 통해 정상적으로 업데이트 볼 수

2011-12-13 20 : 54 : 26.468 HelloWorld1에 [1283 : 707] 0.739568, 0.865854, 1.000000, 1.000000

...하지만 배경색이 변경되지 않습니다. 나는 여기에 초보적인 것을 놓치고있는 것처럼 느껴진다. 어떤 제안이 있니? 고맙습니다!

+0

문제는 const 값을 쓰고있어 새로운 값을 무시한다는 것입니다. @jojaba와 같은 것이 아래에 제안하고 있습니까? –

+0

시간이 좀 걸렸지 만, 당신이 의미하는 바를 봅니다. 고맙습니다! 아래에서 jojaba의 제안을 살펴 보겠습니다. – idiolect

+0

그냥 내 의견을 볼 수 있는지 확인하십시오 ... jojaba가 제안하는 것이 올바른 아이디어이지만 실제로 컴파일되지는 않습니다. –

답변

1

CGColorGetComponents으로 전화하지 마십시오. 대신 클래스에 CGFloat components[4] ivar을 만들고 init에 직접 설정하십시오.

예 ...

@interface MyView : UIView 
{ 
    CGFloat components[4]; 
} 
@end 

...

-(id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self != nil) 
    { 
     components[0] = 1; 
     components[1] = 1; 
     components[2] = 1; 
     components[3] = 1; 

     self.view.backgrounColor = [UIColor colorWithRed:components[0] green:components[1] blue:components[2] alpha:components[3]]; 
    } 
    return self; 
} 

그런 다음 당신이 필요 단지 구성 요소를 변경합니다.

- (IBAction)sendColor:(id)sender { 
    UISlider *slider = (UISlider *)sender; 
    CGFloat newValue = (CGFloat)(slider.value); 
    int senderTag = [sender tag]; 
    components[senderTag] = newValue; 
    UIColor *newColor = [[UIColor alloc] initWithRed:components[0] green:components[1] blue:components[2] alpha:components[3]]; 
    [self.view setBackgroundColor:newColor]; 
    NSString *colorAsString = [NSString stringWithFormat:@"%f, %f, %f, %f", components[0], components[1], components[2], components[3]]; 
    NSLog(@"%@", colorAsString); 
} 
+0

당신은 그 구성 요소의 주소를 보낼 필요가 있습니다. 다만 아래 첨자는'initWithRed : green : blue : alpha'에 충분하지 않습니다. 따라서 :'initWithRed : & components [0] ...'또는'initWithRed : components + 0 ...' –

+0

코드가 작동합니다. 'components' 변수가'CGFloat components [4]'로 정의되어있는 한, 그 값은 직접'components [0-3]'으로 접근 할 수 있습니다. – tidwall

+0

고마워 - 내가 이것을 시작할 때 CGFloat을 올바르게 사용하는 방법을 알지 못했다. 귀하의 의견을 모두 주셔서 감사합니다! – idiolect

0

하려고하면 배경 색상을 설정 한 후 바로보기를 다시 그릴이 줄을 추가 :

이 방법은 그래서 슬라이더를 가하고, 다시 그려되는 전체보기를 일으키는 것을 염두에
[self.view setNeedsDisplay]; 

곰 변경 이벤트로 인해 오버 헤드가 발생할 수 있습니다.

편집 :

으로는 다른 답변으로 지적하지만, 여기에 주요 문제는 함수 CGColorGetComponents() 실제로 일정한 형식을 반환해야합니다.