在rect中绘制线性渐变适用于iOS 5.x但不适用于4.x.

时间:2011-12-05 22:03:14

标签: iphone objective-c ios ipad core-graphics

我有一些代码用于填充带有线性渐变的视图,我已将其重构为辅助方法。这在iOS 5.x上很好用,但是当我尝试在4.3.5上运行时,我什么都没得到。我已经检查了所有的CG调用,并且它们都支持4.0或更早版本,它看起来如此简单,我看不出为什么它在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并且工作得很好,直到我开始测试旧的操作系统版本,因为我即将发布。

3 个答案:

答案 0 :(得分:3)

我有同样的问题, solve 通过使用

创建渐变来解决它
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 :(得分:1)

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

答案 2 :(得分:0)

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