嗨,大家好,我试图使视图从具有背景的渐变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
}
答案 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
仅被称为从Xib
或Storyboard
文件加载的视图。这是来自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)
}
}
希望它对您有帮助。