簡體   English   中英

重新加載UIView漸變背景

[英]Reload UIView gradient background

我已經將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背景嗎?

看起來您的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將視圖設置為臟視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM