我一直在尝试使用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);
}
感谢您的帮助..
答案 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)
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)
}