2016-11-14 3 views
0

Так что мой класс выглядит следующим образом:Gradient вид не работает при добавлении программно

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 - это строка, и вам нужно поместить цвета, которые вы задали в этой строке: ex: gradient.locations = [NSNumber (значение: 0.0), NSNumber (значение : 0.415), NSNumber (значение: 0.874), NSNumber (значение: 1.0)] 1 является конечным пунктом и 0 является стартовым. Вам нужно 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

Спасибо, что установка рамки градиента в ноль была проблемой –