我知道以前在这个问题上有很多变化,但似乎都没有捕捉到我遇到的特殊问题。我是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
...但背景颜色永远不会改变。我觉得我在这里遗漏了一些简陋的东西,你有什么建议吗?谢谢!
答案 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()
确实返回一个常量类型。