Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 重新加载视图渐变背景_Ios_Objective C_Xcode_Uiview - Fatal编程技术网

Ios 重新加载视图渐变背景

Ios 重新加载视图渐变背景,ios,objective-c,xcode,uiview,Ios,Objective C,Xcode,Uiview,我已将UIView背景色设置为一个效果良好的CAGRADENT图层。我试图在应用程序运行时改变它的梯度。如果我关闭并重新加载应用程序,将应用新的渐变,但我希望它在运行时工作 CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = self.backGroundView.bounds; gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteCo

我已将UIView背景色设置为一个效果良好的CAGRADENT图层。我试图在应用程序运行时改变它的梯度。如果我关闭并重新加载应用程序,将应用新的渐变,但我希望它在运行时工作

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背景?

看起来像是您的
渐变。颜色
数组未正确初始化。右边有点乱:)

有时候,有必要说得详细一点,因为这样可以使代码更具可读性,也就是说,你可以把问题分成多行,这样你的大脑就能更好地控制,因为你能更好地看到发生了什么。因此,让我们在单独的行a上初始化颜色,看看它是否有效

    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类型,NSArray实际上是一个“id”数组,它们是指向任何对象的“哑”指针。因此,我们创建我们的CGCULL实例(在单独的行上是清醒的),然后我们(使用现代的客观C文字为神的缘故:)创建数组,并且因为您将CoundFoundation对象(CGLoice)投射到基础对象(ID),所以需要桥接。

现在,您还可以在运行时重用代码,例如在按下按钮的操作中。因为在图层层次中已经有了渐变图层,所以需要获得对它的引用。(第一行就行了)


您不需要使用setNeedsLayout和LayoutIfNeed将视图设置为脏视图

谢谢你的详细回复。渐变是存在的,但如果我更改其中一个CGColorRef,它不会重新加载视图?已为更改颜色的操作更新。。我知道渐变层是子层数组中的第一个对象,但关键是要在层层次结构中的任何位置获得对适当层对象的引用。
- (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];
}