我试图将渐变设置为我的子类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中......
谢谢你的帮助。
答案 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。