【发布时间】:2017-09-01 23:40:57
【问题描述】:
我正在尝试为我的子类 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 : 类 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 在代码和 Interface Builder 中设置某种主题 API……以及将渐变直接添加到 Interface Builder 中的能力……
感谢您的帮助。
【问题讨论】:
-
不要最小化 blended(withFraction: 0.5, of: UIColor) 函数,它是 UIColor 的扩展,我用系数创建了混合颜色。
-
viewDidLoad为时过早,无法捕获 viewController 的view的运行时frame。您是否尝试在视图显示在屏幕上后在调试器中打印渐变视图的框架?这可能会告诉你为什么它不在屏幕上。 -
我想我可能对调试器不够了解,因为我不太明白你想告诉我什么。
-
好的,例如,在上面粘贴的
viewDidLoad中的self.view.addSubview...处放置一个断点。当断点命中时,它会冻结应用程序,在 Xcode 底部的调试器中,您可以键入p backView.frame,它会在控制台中打印帧。我怀疑你会看到高度/宽度为 0,或者类似的东西来解释为什么你没有在屏幕上看到它。 -
啊,好吧...我通常在值窗口中使用 Epressions,并且我已经验证我得到了正确的帧。尽管如此,这里是打印的结果: print backView.frame (CGRect) $R2 = (origin = (x = 0, y = 0), size = (width = 375, height = 667))
标签: swift uiview background uinavigationcontroller gradient