设置UIVIew的背景颜色失败

时间:2011-12-14 02:15:00

标签: objective-c ios

我知道以前在这个问题上有很多变化,但似乎都没有捕捉到我遇到的特殊问题。我是iOS开发和Objective-C的新手,所以如果这是我特别基本的疏忽,请耐心等待。

我正在尝试动态更改视图的背景颜色(它是单个视图应用程序。)我可以通过以下语句轻松更改背景颜色:

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

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

当我尝试动态更改其中一个RGBA值时遇到麻烦(在这种情况下使用滑块)。我有四个滑块,标签为0-3,通过此方法连接:

- (IBAction)sendColor:(id)sender {
    UISlider *slider = (UISlider *)sender;
    CGFloat newValue = (CGFloat)(slider.value);
    int senderTag = [sender tag];
    CGFloat *components = CGColorGetComponents(self.view.backgroundColor.CGColor);
    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);
}

当我移动滑块时,我可以通过NSLog看到值正确更新:

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

...但背景颜色永远不会改变。我觉得我在这里遗漏了一些简陋的东西,你有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

尝试在设置背景颜色后立即重新绘制视图,添加以下行:

[self.view setNeedsDisplay];

请记住,此方法会导致重绘整个视图,因此将其置于滑块更改事件上可能会导致开销。

编辑:

然而,正如其他答案所指出的,这里的主要问题必须是函数CGColorGetComponents()确实返回一个常量类型。