【问题标题】:Drawing linear gradient in a rect works on iOS 5.x but not 4.x在 rect 中绘制线性渐变适用于 iOS 5.x 但不适用于 4.x
【发布时间】:2011-12-05 22:03:13
【问题描述】:

我有一些代码用于用线性渐变填充视图,我已将其重构为辅助方法。这在 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,并且在我即将发布之前开始测试旧版操作系统之前一直运行良好。

【问题讨论】:

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

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


【解决方案1】:

我遇到了同样的问题,解决了通过使用

创建渐变来解决它
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。

【讨论】:

    【解决方案2】:

    我不得不面对与试图用渐变填充视图相同的问题。最后我发现特定的 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 中也有一个渐变

    【讨论】:

    • 很高兴知道。我最终只是放弃了对这个应用程序的 4.x 支持。我提交了一份错误报告,最后得到了 Apple 的回复,基本上说是的,这是一个错误。但是我们已经从 4.x 开始,所以我们不会修复。这是可以理解的。
    【解决方案3】:

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

    【讨论】:

    • 我只是想确保在我走这条路之前我没有搞砸什么。由于大多数时候您认为存在 API 错误,这确实是您的错误。
    • 相同的代码,不同的操作系统版本,不同的行为,对吧?顾名思义,这是一个错误。
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多