2015-05-28 4 views
-1

Я использую градиент в подвид UIView, вернувшись в приложение, переключившись с некоторых приложений, градиент станет черным. Не знаю, почему. Если кто-нибудь знает об этом, помогите мне здесь.Градиент превращается в черный

Также я не подклассировал его программно, прямо поместив его в место класса UIView в самой раскадровке (CustomGradientBlueView). Это может быть проблемой.? Это код, который я использую для градиента ->

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() 

Вы звоните CGContextSaveGState без вызова CGContextRestoreGState, чтобы сбалансировать его. Это очень опасно. Если контекст поддерживается, что вполне возможно, то вы говорите addClipснова с вашим предыдущим обтравочным контуром, который все еще находится на месте - потому что вы не удалили его с балансировкой CGContextRestoreGState после рисования. Из-за природы обтравочных контуров это приводит к тому, что вы можете обрезать весь ваш облик, и ваш рисунок полностью подавлен - следовательно, черный вид.

(Совершенно не ясно, что вы думаете о том, что вы делаете с этим обтравочным контуром в любом случае. Не нужно зажимать границы экрана, а доступ к границам экрана внутри окна drawRect: - это очень странная вещь вы можете быть счастливее, просто удалив эти четыре строки вообще.)

+0

Вы правильно матовый, я прочитал документ, получивший концепцию. Спасибо за ваше драгоценное время :) –

+0

Я изменил код с кодом, который вы предложили, и снова появился черный фон. –

Смежные вопросы