2015-03-19 69 views
1

我无法在相同视图中显示带有渐变的2个矩形。我的下面的代码只显示第一个矩形。如果我在代码中省略矩形1,则显示矩形2。只有组合它才会显示矩形1。在IOS中同一视图上绘制2个带有渐变的矩形(swift)

我喜欢显示蓝色rectangle1 ...

enter image description here

...和红色rectangle2具有不同梯度...

enter image description here

...在同时。

我对这个下面的代码:

func draw_2_gradient_rectangles(){ 

    let locations: [CGFloat] = [ 0.0, 1.0 ] 

    let colorspace = CGColorSpaceCreateDeviceRGB() 

    // first rectangle 
    let context = UIGraphicsGetCurrentContext() 
    let colors = [UIColor.blueColor().CGColor, 
     UIColor.whiteColor().CGColor] 
    let gradient = CGGradientCreateWithColors(colorspace, 
     colors, locations) 

    var startPoint1 = CGPoint() 
    var endPoint1 = CGPoint() 
    startPoint1.x = 0.0 
    startPoint1.y = 10.0 
    endPoint1.x = 100; 
    endPoint1.y = 10 

    let rectangle_main1 = CGRectMake(CGFloat(15), CGFloat(0), CGFloat(100), CGFloat(30)); 
    CGContextAddRect(context, rectangle_main1); 
    CGContextClip(context) 
    CGContextDrawLinearGradient(context, gradient, startPoint1, endPoint1, 0) 

    // second rectangle 
    let context2 = UIGraphicsGetCurrentContext() 
    let colors2 = [UIColor.redColor().CGColor, 
     UIColor.whiteColor().CGColor] 
    let gradient2 = CGGradientCreateWithColors(colorspace, 
     colors2, locations) 

    var startPoint2 = CGPoint() 
    var endPoint2 = CGPoint() 
    startPoint2.x = 100; 
    startPoint2.y = 10.0; 
    endPoint2.x = 10.0; 
    endPoint2.y = 10.9; 


    let rectangle_main2 = CGRectMake(CGFloat(15), CGFloat(50), CGFloat(100), CGFloat(30)); 
    CGContextAddRect(context2, rectangle_main2); 
    CGContextClip(context2) 
    CGContextDrawLinearGradient(context2, gradient2, startPoint2, endPoint2, 0); 


} 

我在做什么错?任何帮助?

+0

如何使用一个上下文而不是两个? – Prontto 2015-03-19 08:39:05

回答

3

UIGraphicsGetCurrentContext()不创建上下文,但只是给你一个当前的参考。 这意味着contextcontext2相同。在context中,您剪切了绘图区域,以便下一个CGContextAddRect将绘制在裁剪区域之外。

你需要做的是与每个矩形创建代码之前保存绘制状态:

CGContextSaveGState(context); 

,并做了第二个矩形代码

CGContextRestoreGState(context); 

这将确保前恢复裁剪区域在绘制第二个矩形之前被重置。例如:

CGContextSaveGState(context); 
// Create rectangle1 
CGContextRestoreGState(context); 

CGContextSaveGState(context); 
// Create rectangle2 
CGContextRestoreGState(context); 
+0

非常感谢。这就是解决方案。 – 2015-03-19 08:53:20