为什么我的后台梯度视图没有加载到我的客户UINavigationController类中

时间:2017-04-06 19:00:53

标签: swift uiview background uinavigationcontroller gradient

我试图将渐变设置为我的子类NavigationController的背景。当我为相同的代码添加颜色时,它运作良好,但我似乎无法让我的渐变显示出来。我创建了一个UIView的子类,它返回一个CAGradientLayer作为其背景视图。

这是我的子类UIView :(注意颜色很奇怪所以我确定它加载了正确的渐变。

@IBDesignable
class GenericBackgrounView: UIView {

override class var layerClass: AnyClass {
    return CAGradientLayer.self
}


///The roundness for the corner
@IBInspectable var cornerRadius: CGFloat = 0.0 {
    didSet{
        setupGradient()
    }
}

func setupGradient() {
    //let gradientColors = [bgDarkColor.cgColor, bgDarkColor.blended(withFraction: 0.5, of: bgLightColor).cgColor, bgLightColor.cgColor]
    let gradientColors = [UIColor.brown.cgColor, UIColor.red.blended(withFraction: 0.5, of: UIColor.cyan).cgColor, UIColor.yellow.cgColor]
    gradientLayer.colors = gradientColors
    gradientLayer.locations = ESDefault.backgroundGradientColorLocations
    setNeedsDisplay()
}

var gradientLayer: CAGradientLayer {
    return self.layer as! CAGradientLayer
}

override func awakeFromNib() {
    super.awakeFromNib()
    setupGradient()
}
override func prepareForInterfaceBuilder() {
    setupGradient()
}

}

这是我的UINavigationController:     class GenericNavigationController:UINavigationController {

override func viewDidLoad() {
    super.viewDidLoad()
    let backView = GenericBackgrounView(frame: self.view.frame)
    backView.bounds = self.view.bounds
    self.view.backgroundColor = UIColor.clear
    self.view.addSubview(backView)
    self.view.sendSubview(toBack: backView)

    // Do any additional setup after loading the view.
}
}

另请注意,当我将GenericBackgroundView用于我在界面构建器中添加的任何视图时,它的工作正常。

我很久以前就已经这么做了。我想我会建议Apple在代码和界面生成器中设置某种形式的API ......并且能够直接将渐变添加到Interface Builder中......

谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

不要在awakeFromNib()中进行设置,请尝试在viewDidLayoutSubviews()中调用它。原因是在viewDidLayoutSubviews()中会有正确的视图框架,而在awakeFromNib()中,您无法知道视图的正确框架。从Apple Documentation开始。

答案 1 :(得分:0)

好吧,我已经修改了一下,发现了一些正常工作的代码。我仍然希望了解其工作原因,而不是我以前的方式。我讨厌感觉它是神奇的......

这是工作代码:(请记住,我的渐变是CAGradientLayer的形式,我已经制作了一些默认的静态变量。

import UIKit

class GenericNavigationController: UINavigationController {
    let backViewGradient = Default.testGradientCALayer
    override func viewDidLoad() {
        super.viewDidLoad()
        setupBackground()
    }

    func setupBackground() {
        backViewGradient.frame = self.view.frame
        self.view.layer.insertSublayer(backViewGradient, at: 0)
    }

    override func prepareForInterfaceBuilder() {
        setupBackground()
    }
}

我想知道的是,因为从UIView子类化的所有UIControl都不是一样的。他们应该都有一个视图作为背景,我们都应该能够为他们添加一个图层或子视图,并能够使我以前的代码工作,或者我的最新代码也无法使用TableViewCells。

我会把这个问题留下来,因为我很想知道这背后的真相。我不认为如果它表现得有些神奇和不一致,我可以完全掌握Swift或Xcode。