2016-11-14 41 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

感谢设置梯度帧为零是问题 –