2017-01-16 15 views
2

我有這樣的擴展漸變斯威夫特添加到視圖:如何漸變的真實設備上應用到UIView的iOS中10

extension UIView { 
    func addGradientWithColor(colorTop: UIColor, colorButton: UIColor){ 
     let gradient = CAGradientLayer() 
     gradient.frame = self.bounds 
     gradient.colors = [colorTop.cgColor, colorButton.cgColor] 

     self.layer.insertSublayer(gradient, at: 0) 
    } 
} 

然後,我用它一樣,在我的UIViewController:

override func viewDidLoad(){ 
    self.view.addGradientWithColor(colorTop: UIColor.red, colorButton: UIColor.clear)   
    super.viewDidLoad() 
} 

我運行模擬器,它工作得很好。但是當我想在真實設備上使用我的應用程序時,漸變不起作用。

PD:我嘗試了很多方法來做一個漸變,但沒有在一個真實的設備上工作。

回答

12

問題是,當視圖的大小發生變化時,您不會調整圖層的大小,因此它仍然保持初始值,這主要取決於視圖是如何創建的。

我建議當視圖調整大小的layoutSubviews方法,它總是被調用使用UIView子類,並更新層尺寸:

@IBDesignable 
open class GradientView: UIView { 
    @IBInspectable 
    public var startColor: UIColor = .white { 
     didSet { 
      gradientLayer.colors = [startColor.cgColor, endColor.cgColor] 
      setNeedsDisplay() 
     } 
    } 
    @IBInspectable 
    public var endColor: UIColor = .white { 
     didSet { 
      gradientLayer.colors = [startColor.cgColor, endColor.cgColor] 
      setNeedsDisplay() 
     } 
    } 

    private lazy var gradientLayer: CAGradientLayer = { 
     let gradientLayer = CAGradientLayer() 
     gradientLayer.frame = self.bounds 
     gradientLayer.colors = [self.startColor.cgColor, self.endColor.cgColor] 
     return gradientLayer 
    }() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     layer.insertSublayer(gradientLayer, at: 0) 
    } 

    public required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     layer.insertSublayer(gradientLayer, at: 0) 
    } 

    open override func layoutSubviews() { 
     super.layoutSubviews() 
     gradientLayer.frame = bounds 
    } 
} 

上面還的代碼讓你調整的開始和結束來自Xcode的顏色,因此您可以估計部署時視圖的外觀。

+0

哇,它的工作,感謝= d –

+0

@CristianMora很高興我可以幫助你。你可以通過接受/提升它來標記這個答案嗎? – Cristik

+0

什麼是ToTGradientView?谷歌搜索它只出現這個StackOverflow後 – Will

2

試試這個,它對我很有用。代碼:

let gradientLayer:CAGradientLayer = CAGradientLayer() 
gradientLayer.frame.size = self.gradientView.frame.size 
gradientLayer.colors = [UIColor.white.cgColor,UIColor.red.withAlphaComponent(1).cgColor] //Use diffrent colors 
gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0) 
gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0) 
self.gradientView.layer.addSublayer(gradientLayer) 

有關詳細信息說明看到這一點:Gradient On UIView

+0

@Moritz :)謝謝 –

相關問題