2013-04-17 85 views
0

我有一個CAGradientLayer在viewDidLoad的背景上繪圖。它在某些時候有效,但有時候它只是不會持續渲染任何東西,直到我重新啓動計算機。我無法弄清楚爲什麼有些時候它會起作用,然後其他時候不會。它可以工作,讓5連續建立,然後它會停止渲染。沒有錯誤。任何人都有這方面的經驗?CAGradientLayer有時不渲染

背景層方法:

+ (CAGradientLayer*) morningGradient { 

UIColor *mornTop = [UIColor colorWithRed:0.843 green:0.722 blue:0.667 alpha:1.000]; 
UIColor *mornBottom = [UIColor colorWithRed:0.584 green:0.733 blue:0.945 alpha:1.000]; 

NSArray *colors = [NSArray arrayWithObjects:(id)mornTop.CGColor, mornBottom.CGColor, nil]; 

NSNumber *stopOne  = [NSNumber numberWithFloat:0.0]; 
NSNumber *stopTwo  = [NSNumber numberWithFloat:0.7]; 
NSNumber *stopThree  = [NSNumber numberWithFloat:1.0]; 

NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, stopThree, nil]; 

CAGradientLayer *headerLayer = [CAGradientLayer layer]; 
headerLayer.colors = colors; 
headerLayer.locations = locations; 

return headerLayer; 
} 

繪製方法:

-(void)drawGrad 
{ 
NSLog(@"drawing gradient"); 
CAGradientLayer *bgLayer = [BackgroundLayer morningGradient]; 
bgLayer.frame = self.view.bounds; 
[self.view.layer insertSublayer:bgLayer atIndex:0]; 
} 

viewDidLoad中:

- (void)viewDidLoad 
{ 
[self drawGrad]; 
[super viewDidLoad]; 
} 

回答

0

CGGradientCreateWithColors(colorSpace, colors, locations[])的文檔,你可以閱讀

locations數組應該包含與colors數組相同數量的項目。

我假設對CAGradientLayer也是如此,但在文檔中找不到任何東西。我正在做這個假設,因爲它是有道理的。你會如何解釋兩種顏色和三個位置?第三個地點應該是什麼顏色?

更改您的代碼,以便通過與地點相同數量的顏色

+0

這聽起來合乎邏輯的。我會給這個鏡頭 - 謝謝!我在腦海中想象到第三個位置是混合點(所以將它移動到0.5以上會使兩個顏色混合在一起,就像在Photoshop中混合了像錨點那樣的50/50)。 – NessyString

+0

謝謝大衛,這工作。這非常令人沮喪 - 我感到很蠢。 – NessyString

0

創建大小爲3輪RECT定義漸變色視圖,你需要添加QuartzCore框架,然後按照下面的代碼(h文件和.m文件)

#import <UIKit/UIKit.h> 

    @interface CustomGradientView : UIView 

    @end 


#import "CustomGradientView.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation CustomGradientView 

    - (void)drawRect:(CGRect)rect 
    { 

     CGContextRef context = UIGraphicsGetCurrentContext(); 

     UIColor *color1=[UIColor whiteColor]; 
     CGColorRef startColor =color1.CGColor; 

     UIColor *color2=[UIColor redColor]; 
     CGColorRef endColor = color2.CGColor; 

     drawLinearGradient(context, rect, startColor, endColor); 


     CGPathRef p = [[UIBezierPath bezierPathWithRoundedRect:rect 
                cornerRadius:3] CGPath]; 
     CGContextAddRect(context, rect); 
     CGContextAddPath(context, p); 
     CGContextEOClip(context); 
     CGContextClearRect(context, rect); 

    } 

    @end 
+0

哇,謝謝你的回答,幸運的是,我從來沒有機會嘗試它!雖然看起來不錯 – NessyString