2011-12-05 21 views
2

我有一些代码用于用线性渐变填充视图,我已将它重构为辅助方法。这在iOS 5.x上画得很好,但是当我尝试在4.3.5上运行时,我什么也没得到。我已经检查过所有的CG调用,并且它们都支持4.0或更高版本,它看起来非常简单,我看不出它为什么在4.x上不起作用。在rect中绘制线性渐变在iOS 5.x上工作,但不是4.x

- (void)drawRect:(CGRect)rect { 

CGContextRef context = UIGraphicsGetCurrentContext();  
CGColorRef startColor = [UIColor lightGrayColor].CGColor; 
CGColorRef endColor = [UIColor blackColor].CGColor;  
CGRect paperRect = self.frame; 
[GraphicsHelpers drawLinearGradientWithContext:context 
             inRect:paperRect 
            startColor:startColor 
             endColor:endColor]; 
} 

这里是一个方法

+ (void)drawLinearGradientWithContext:(CGContextRef)context inRect:(CGRect)rect startColor:(CGColorRef)startColor endColor:(CGColorRef)endColor { 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGFloat locations[] = { 0.0, 1.0 }; 

NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil]; 

CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, 
                (__bridge CFArrayRef) colors, locations); 

CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); 
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); 

CGContextSaveGState(context); 
CGContextAddRect(context, rect); 
CGContextClip(context); 

CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); 
CGContextRestoreGState(context); 

CGGradientRelease(gradient); 
CGColorSpaceRelease(colorSpace); 

}

我发现大部分代码here的和是伟大的工作,直到我开始对旧的操作系统版本测试,我亲近的释放。

+0

对于您的paperRect,我会使用'self.bounds'而不是'self.frame'。 –

回答

0

如果您使用的是受支持的API,并且从一个版本的操作系统到另一个版本获得不同的结果,请提交错误报告。

+0

我只是想确保在我走这条路线之前我没有搞砸某些东西。由于大多数时候您认为存在API错误,因此确实是您的错误。 – jamone

+0

相同的代码,不同的操作系统版本,不同的行为,对吧?这是一个定义错误。 – NSResponder

3

我有同样的问题,解决了 围绕 它的工作创建使用

CGGradientCreateWithColorComponents 

梯度..而不是CGGradientCreateWithColors。

所以,从浅灰色到黑色的渐变,你需要做到以下几点:

CGFloat colors[8] = { 
    0.9f, 0.9f, 0.9f, 1.0f, // light gray 
    0.0f, 0.0f, 0.0f, 1.0f // black 
}; 

CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, 2); 

这个工作在两个的iOS 4和5

1

我不得不面对同样的问题,作为一个试图用渐变填充视图。最后我发现特定的UIColor(redColor,whiteColor等)与CGColors不兼容。 使用([UIColor whiteColor] .CGColor)为ios 4.3中不兼容或不支持的CGColor提供服务。为此,我尝试使用[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0] .CGColor。这可以转换成CGColor空间,最后我在我的视图中也有一个渐变,使用ios 4.3和ios 5.x

+0

很高兴知道。我结束了对这个应用程序的4.x支持。我提交了一个bug报告,最终得到了苹果的回应,基本上说它是一个bug。但是我们已经从4.x开始,所以我们不会修复。这是可以理解的。 – jamone

相关问题