2015-05-28 33 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

我改變了代碼與您建議的代碼,再次黑色背景出現了。 –