渐变视图无法通过编程快速运行

时间:2018-09-15 20:43:40

标签: ios swift

嗨,大家好,我试图使视图从具有背景的渐变UIView继承,但是出于一个或两个原因,它没有继承。这是我的代码:

// The gradient class I want to be inherited from
class GradientView: UIView {

    var gradient = CAGradientLayer()

    override func awakeFromNib() {
        super.awakeFromNib()
        setupGradientView()
    }

    func setupGradientView(){
        gradient.frame = self.bounds
        gradient.colors = [UIColor.white.cgColor, UIColor.init(white:1.0, alpha: 0.0).cgColor]
        gradient.startPoint = CGPoint.zero
        gradient.endPoint = CGPoint(x: 0, y: 1)
        gradient.locations = [0.8,1.0]
        self.layer.addSublayer(gradient)
    }

}

let headerHolder: GradientView = {
        let view = GradientView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

//Where i set up the views
  func setupViews() {
    view.addSubview(headerHolder)
            headerHolder.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
            headerHolder.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
            headerHolder.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
            headerHolder.heightAnchor.constraint(equalToConstant: 80).isActive = true
}

3 个答案:

答案 0 :(得分:0)

您需要在内部调用

getActvity()

在这种初始化情况下,不会调用override init(frame: CGRect),因为从xib / stroryboard加载视图时会调用它

在内部设置框架

awakeFromNib

因为它是查看正确的地方override func layoutSubviews{}

//

bounds

答案 1 :(得分:0)

问题在于,因为您直接创建了CAGradientLayer,所以它不参与UIKit的布局系统。您正在为当前设备调整GradientView的大小之前设置渐变层的框架。

告诉GradientView,而不是直接创建渐变层并将其作为GradientLayer层的子层:

CAGradientLayer

答案 2 :(得分:0)

第一个问题是您重写了awakeFromNib方法,但是它从未被调用,因为您是以编程方式创建GradientView的。您会看到,awakeFromNib仅被称为从XibStoryboard文件加载的视图。这是来自Apple Documentation的引用。

  

nib加载基础结构向从nib存档重新创建的每个对象发送awakeFromNib消息,但是仅在存档中的所有对象均已加载并初始化之后。

因此,如果要以编程方式创建视图,则需要覆盖init(frame: CGRect)

第二个问题是在setupGradientView方法中您正在使用self.bounds,但是尚未计算视图边界,因为尚未调用layout。您可以通过layoutSubviews方法设置渐变图层框架。

class GradientView: UIView {

    var gradient = CAGradientLayer()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupGradientView()
    } 

    override func layoutSubviews() {
        super.layoutSubviews() 
        gradient.frame = self.bounds
    }

    func setupGradientView() {
        let colorFrom = UIColor.white.cgColor
        let colorTo = UIColor.init(white:1.0, alpha: 0.0).cgColor
        gradient.colors = [colorFrom, colorTo]
        gradient.startPoint = CGPoint.zero
        gradient.endPoint = CGPoint(x: 0, y: 1)
        gradient.locations = [0.8, 1.0]
        self.layer.addSublayer(gradient)
    }

}

希望它对您有帮助。