0

我正在编写一个简单红色渐变的按钮背景,它在高度小于 100 时有效,但如果按钮大于该值,它将停止加载渐变,我不知道为什么。我正在使用 PaintCode(到目前为止,它的作用就像一个魅力)来绘制代码,然后我将渐变的大小从 更改为[UIBezierPath bezierPathWithRoundedRect: CGRectMake(0, 0, 240, 120) cornerRadius: 4];[UIBezierPath bezierPathWithRoundedRect: CGRectMake(0, 0, self.frame.size.width, self.frame.size.height) cornerRadius: 4];因为按钮的大小在 4.5" 和 5" 设备之间变化。我正在使用具有相同代码的其他渐变减去其他按钮上的颜色,它们工作得很好。只有当高度大于 100 pts 时我才发现问题。知道有什么问题吗?

这是我正在使用的代码:

//// General Declarations
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = UIGraphicsGetCurrentContext();

//// Color Declarations
UIColor* lightRedColor = [UIColor colorWithRed: 1 green: 0.188 blue: 0.098 alpha: 1];
UIColor* darkRedColor = [UIColor colorWithRed: 0.812 green: 0.016 blue: 0.016 alpha: 1];

//// Gradient Declarations
NSArray* redGradientColors = [NSArray arrayWithObjects:
                              (id)lightRedColor.CGColor,
                              (id)[UIColor colorWithRed: 0.906 green: 0.102 blue: 0.057 alpha: 1].CGColor,
                              (id)darkRedColor.CGColor, nil];
CGFloat redGradientLocations[] = {0, 0.5, 1};
CGGradientRef redGradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)redGradientColors, redGradientLocations);

//// Rounded Rectangle Drawing
UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(0, 0,  self.frame.size.width, self.frame.size.height) cornerRadius: 4];
CGContextSaveGState(context);
[roundedRectanglePath addClip];
CGContextDrawLinearGradient(context, redGradient, CGPointMake(120, 0), CGPointMake(120, 120), 0);
CGContextRestoreGState(context);


//// Cleanup
CGGradientRelease(redGradient);
CGColorSpaceRelease(colorSpace);

编辑:这是按钮的屏幕截图:

4

2 回答 2

1

CGContextDrawLinearGradient(context, redGradient, CGPointMake(120, 0), CGPointMake(120, 120), 0);

在这里,您指定要绘制的渐变区域的高度,终点为 y=120。这意味着无论上面的代码如何,您的渐变都将是 120 点高。将终点更改为CGPointMake(120, self.bounds.size.height),您应该没问题。

于 2013-08-03T08:43:22.687 回答
0

看起来问题是[roundedRectanglePath addClip];。具体来说,已在代码中的其他位置在当前图形上下文中指定了一个剪切路径,并且在它应该被删除时没有被删除(缺少对 的调用CGContextRestoreGState),或者它被设置为比应有的更小的大小。

检查已添加但未删除的剪切路径。还要检查设置为剪辑子视图且大小不正确的超级视图。

于 2013-08-03T06:49:10.310 回答