【问题标题】:Reload UIView gradient background重新加载 UIView 渐变背景
【发布时间】:2015-04-23 04:57:21
【问题描述】:

我已将 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 背景?

【问题讨论】:

    标签: ios objective-c xcode uiview


    【解决方案1】:

    您的 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 将视图设置为脏。

    【讨论】:

    • 感谢您的详细回复。渐变是存在的,但是如果我更改其中一个 CGColorRef 它不会重新加载视图?
    • 更新了改变颜色的动作。我知道渐变层是子层数组中的第一个对象,但关键是要获得对适当层对象的引用,无论它在层层次结构中的任何位置。跨度>
    猜你喜欢
    • 2023-03-19
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    相关资源
    最近更新 更多