我有一些代码用于填充带有线性渐变的视图,我已将其重构为辅助方法。这在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并且工作得很好,直到我开始测试旧的操作系统版本,因为我即将发布。
答案 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,并且从一个版本的操作系统获得不同的结果,请提交错误报告。