我已将UIView背景颜色设置为CAGradient图层,效果很好。我正在尝试在应用程序运行时更改此渐变。如果我关闭并重新加载应用程序,则会应用新的渐变,但我想在运行时使用它。
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.backGroundView.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], color.CGColor, nil];
[self.backGroundView.layer insertSublayer:gradient atIndex:0];
[self.backGroundView setNeedsDisplay];
self.backGroundView.contentMode = UIViewContentModeRedraw;
我已尝试过setNeedsDisplay和UIViewContentModeRedraw,但在应用运行时都没有更新UIview背景?
答案 0 :(得分:0)
看起来您的gradient.colors
数组未正确初始化。右侧有点混乱:)。
有时需要一些冗长,因为它使代码更具可读性,即你将问题分成多行,这样你的大脑就可以更好地控制,因为你可以更好地了解正在发生的事情。因此,让我们在单独的行上初始化颜色,看看它是否有效。
CAGradientLayer *gradient = [CAGradientLayer layer];
CGColorRef color1 = [UIColor redColor].CGColor;
CGColorRef color2 = [UIColor greenColor].CGColor;
gradient.colors = @[ (__bridge id)color1 , (__bridge id)color2 ];
[self.view.layer insertSublayer:gradient atIndex:0];
有点诡计。 CoreAnimation框架期望在数组中找到CGColor对象。但是属性是NSArray类型,NSArrays确实是一个“id”的数组,它是任何对象的“哑”指针。所以我们创建我们的CGColor实例(在单独的线条上为了理智),然后我们(使用现代客观C文字为上帝的缘故:)创建数组,因为你将CoreFoundation对象(CGColors)转换为Foundation对象(id)它需要被桥接。
现在,您也可以在运行时重用代码,例如在按下按钮的操作中。由于您已经在图层层次结构中已经有了渐变图层,因此您需要获得对它的引用。 (第一行做到了)
- (IBAction)changeColorsOnbuttonPressed:(id)sender
{
CAGradientLayer *gradient = [self.view.layer.sublayers firstObject];
CGColorRef color1 = [UIColor blueColor].CGColor;
CGColorRef color2 = [UIColor yellowColor].CGColor;
gradient.colors = @[(__bridge id)color1, (__bridge id)color2];
}
您不需要使用setNeedsLayout和layoutIfNeeded将视图设置为脏。