2016-11-14 42 views
0

所以我的課是這樣的:梯度視圖不工作程序

import UIKit 

class GradientBarView: UIView { 

    override init(frame: CGRect) { // for using CustomView in code 
     super.init(frame: frame) 
     commonInit() 

    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     commonInit() 
    } 

    func commonInit() { 

     let gradient = CAGradientLayer() 
     gradient.frame = bounds 
     gradient.startPoint = CGPoint(x: 0, y: 0.5) 
     gradient.endPoint = CGPointMake(1, 0.5) 
     gradient.colors = [AppColor.SecondaryGreen.CGColor, AppColor.HeritageGreen.CGColor, AppColor.HeritageGreen.CGColor] 
     layer.insertSublayer(gradient, atIndex: 0) 

     translatesAutoresizingMaskIntoConstraints = false 

    } 

} 

,這是我如何使用它(在我viewDidLoad中)

let gradientBar = GradientBarView(frame: CGRectZero) 
self.view.addSubview(gradientBar) 

然後添加必要的約束(這是好的)...所以問題是,視圖只是黑色,但如果我通過故事板添加它,它工作得很好

請幫助,我失蹤了什麼?

感謝

+0

您應該使用漸變圖層作爲視圖的圖層。有關詳細信息,請參閱'layerClass'(https://developer.apple.com/reference/uikit/uiview/2098374-layerclass)。 – clemens

+0

你應該爲不同的顏色指定位置(基本上你的startPoint和endPoint是一條線,你需要定位你在該行設置的顏色: 例如:gradient.locations = [NSNumber(value:0.0),NSNumber(value :0.415),NSNumber(值:0.874),NSNumber(值:1.0)] 1是endPoint,0是startPoint。您需要添加每個顏色的1個位置 – Jeremy

回答

2

你的框架是由CGRectZero你打電話gradient.frame =界限在commonInit的時間。因此你的界限也將是CGRectZero。因此您插入的框架沒有高度或寬度。

您可以在自定義視圖的繪製方法中添加漸變。 override func draw(_ rect: CGRect)只要確保您不要多次添加它。

或者將其添加到layoutSubviews,具體取決於您的使用。例如:

class GradientBarView: UIView { 

    var gradientLayer: CAGradientLayer? 

    override init(frame: CGRect) { // for using CustomView in code 
     super.init(frame: frame) 
     commonInit() 

    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     commonInit() 
    } 

    func commonInit() { 
     translatesAutoresizingMaskIntoConstraints = false 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     gradientLayer?.removeFromSuperlayer() 
     gradientLayer = self.addHorizontalGradient(color: UIColor.blue) 
    } 

} 

extension UIView { 

    func addHorizontalGradient(color: UIColor) -> CAGradientLayer { 
     let gradient = CAGradientLayer() 
     gradient.frame = self.bounds 
     gradient.startPoint = CGPoint(x:0,y:0.5) 
     gradient.endPoint = CGPoint(x:1,y:0.5) 
     gradient.colors = [color.cgColor, UIColor.white.withAlphaComponent(0).cgColor] 
     self.layer.insertSublayer(gradient, at: 0) 
     return gradient 
    } 

} 
+0

感謝設置梯度幀爲零是問題 –