2015-05-28 83 views
-1

我在UIView的子视图中使用渐变,在从某些应用切换回应用后,渐变变为黑色。不知道为什么,如果有人知道这件事,请帮我在这里。渐变变成黑色

此外,我没有以编程方式继承它,直接把它放在故事板本身(CustomGradientBlueView)的UIView类中。这可能是一个问题。? 这是我使用了渐变的代码 - >

import UIKit 

class CustomGradientBlueView: UIView { 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 
    override func drawRect(rect: CGRect) { 

     let context = UIGraphicsGetCurrentContext() 

     // colour declarations 


     let gradientColor1 = UIColor(red: 0.361, green: 0.145, blue: 0.553, alpha: 1.000) 
     let gradientColor2 = UIColor(red: 0.263, green: 0.537, blue: 0.635, alpha: 1.000) 

     // gradient decalarations 

     let gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceRGB(), [gradientColor1.CGColor,gradientColor2.CGColor], [0,1]) 

     //rectangle drawing 

     var screen = UIScreen.mainScreen().bounds.size 

     let rectanglePath = UIBezierPath(rect: CGRectMake(0,0, screen.width, screen.height)) 
     CGContextSaveGState(context) 
     rectanglePath.addClip() 
     CGContextDrawLinearGradient(context, gradient, CGPointMake(0,0), CGPointMake(screen.width, screen.height), 0) 

    } 

} 
+1

为什么不使用CAGradientLayer? –

+0

@MertBuran你能告诉我如何使用CAGradientLayer解决这个问题。有什么区别。? –

+0

“通过从某些应用切换回应用后,渐变变为黑色”您能证明,当您这样做时,会调用'drawRect:'吗? – matt

回答

1

的问题很可能在这些行:

var screen = UIScreen.mainScreen().bounds.size 
let rectanglePath = UIBezierPath(rect: CGRectMake(0,0, screen.width, screen.height)) 
CGContextSaveGState(context) 
rectanglePath.addClip() 

您无需调用CGContextRestoreGState,以平衡它调用CGContextSaveGState。这是非常危险的。如果上下文被保留,这是完全可能的,那么你说的addClip再次与您以前的剪切路径已经在原地 - 因为你没有删除它与平衡CGContextRestoreGState绘图后。由于剪切路径的性质,这会导致您最终导致整个视图剪裁,并且您的绘图被完全抑制 - 因此是黑色视图。 (这并不完全清楚你认为你在这种剪切路径中所做的任何事情,不需要剪辑到屏幕边界,并且访问视图的drawRect:中的屏幕边界是非常奇怪的事情你可能会更快乐,只是完全删除这四条线。)

+0

你是正确的马特,我读了文件得到了概念。感谢您的宝贵时间:) –

+0

我改变了代码与您建议的代码,再次黑色背景出现了。 –