CGContextDrawLinearGradient混乱。需要澄清

时间:2014-03-10 04:13:31

标签: objective-c cgcontext cgcontextref

我一直在尝试使用CGContextDrawLinearGradient,我对起点和终点的含义非常困惑?我认为它们意味着当前CGContext上的坐标,所以如果我将起点定义为0,0并将终点定义为100,100,我将得到一个带渐变的正方形。我完全得到了别的东西,我无法连接到我的坐标。

这是我的代码:

- (void)drawRect:(CGRect)rect {
// Drawing code 
CGContextRef current_context = UIGraphicsGetCurrentContext();
CGContextSaveGState(current_context);

// Gradient
CGFloat locations[3] = {0.0, 0.5, 1.0};
CGFloat components[12] = {1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0};
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, 3);
CGPoint startPoint = CGPointMake(0, 0);
CGPoint endPoint = CGPointMake(40, 40);
CGContextDrawLinearGradient(current_context, gradient, startPoint, endPoint, 0);


// Shadow
CGContextSetShadow(current_context, CGSizeMake(4,7), 1.0);

// Image
UIImage *logoImage = [UIImage imageNamed:@"logo.png"];
[logoImage drawInRect:bounds];
CGContextRestoreGState(current_context);

}

感谢您的帮助..

2 个答案:

答案 0 :(得分:4)

你的大多数代码都很好;问题出现在以下几行:

CGPoint startPoint = CGPointMake(0, 0);
CGPoint endPoint = CGPointMake(40, 40);
CGContextDrawLinearGradient(current_context, gradient, startPoint, endPoint, 0);

CGContextDrawLinearGradient 期望获得起点和终点(定义线,而不是正方形的两个对角线边缘!)。

然后通过彩色线垂直将渐变绘制到此控制线。绘图开始时使用起始颜色(位置0处的颜色)通过startPoint(垂直于startPoint和endPoint之间的直线)的直线。下一行是通过更靠近endPoint的点“一个像素”绘制的,颜色计算在开始和结束之间或下一个颜色之间(取决于颜色位置的数量)。最后,使用最终颜色通过endPoint(再次垂直...)绘制一条线。

使用(控制)线而不是正方形的优点是,可以在任何方向上绘制渐变;水平,垂直,介于两者之间,仅取决于给定线的方向。

在您的示例代码中,渐变应该是对角线,因为您的线与x轴的角度为45°: - )。

答案 1 :(得分:0)

来自raywanderlich tutorial的代码

override func drawRect(rect: CGRect) {

  //2 - get the current context
  let context = UIGraphicsGetCurrentContext()
  let colors = [startColor.CGColor, endColor.CGColor]

  //3 - set up the color space
  let colorSpace = CGColorSpaceCreateDeviceRGB()

  //4 - set up the color stops
  let colorLocations:[CGFloat] = [0.0, 1.0]

  //5 - create the gradient
  let gradient = CGGradientCreateWithColors(colorSpace, 
                                            colors, 
                                            colorLocations)

  //6 - draw the gradient
  var startPoint = CGPoint.zeroPoint
  var endPoint = CGPoint(x:0, y:self.bounds.height)
  CGContextDrawLinearGradient(context, 
                              gradient, 
                              startPoint, 
                              endPoint, 
                              0)
}