swift - 以编程方式在 Swift 中创建背景渐变
问题描述
所以通常要创建渐变我可能有以下内容UIViewController
:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let gradientLayer = CAGradientLayer()
gradientLayer.frame = view.bounds
gradientLayer.colors = [#colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1).cgColor, UIColor(red: 252/255, green: 238/255, blue: 33/255, alpha: 1).cgColor]
gradientLayer.shouldRasterize = true
view.layer.addSublayer(gradientLayer)
}
}
但是,当我以编程方式创建 ViewController 时,我想要等效的。
我尝试了以下方法:
override func loadView() {
let view = UIView()
view.backgroundColor = .red
self.view = view
}
override func viewDidLoad() {
super.viewDidLoad()
let bgView = UIView()
bgView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
let gradientLayer = CAGradientLayer()
gradientLayer.frame = view.bounds
gradientLayer.colors = [#colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1).cgColor, UIColor(red: 252/255, green: 238/255, blue: 33/255, alpha: 1).cgColor]
gradientLayer.shouldRasterize = true
bgView.layer.addSublayer(gradientLayer)
self.view.addSubview(bgView)
}
但我看到的都是红色背景色。
如何以编程方式添加背景渐变?
解决方案
你bgView
有.zero
框架,所以里面的任何东西都是不可见的。
let bgView = UIView()
// Add this line
bgView.frame = view.bounds
bgView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
更新
似乎view.bounds
宽度/高度为零,这导致bgView
在屏幕上不可见。
在添加此渐变之前,您可以尝试等待子视图正确布局。
class ViewController: UIViewController {
override func loadView() {
// This view has zero frame here
let view = UIView()
// Do you see red color on your screen at all?
view.backgroundColor = .red
// If you don't see red color on your screen at all
// then you need to fix the frame for your view
view.frame = UIScreen.main.bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.view = view
}
private lazy var gradientLayer: CAGradientLayer = {
let gradient = CAGradientLayer()
gradient.colors = [#colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1).cgColor, UIColor(red: 252/255, green: 238/255, blue: 33/255, alpha: 1).cgColor]
gradient.shouldRasterize = true
return gradient
}()
private lazy var bgView: UIView = {
let bg = UIView()
bg.autoresizingMask = [.flexibleWidth, .flexibleHeight]
return bg
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(bgView)
bgView.layer.addSublayer(gradientLayer)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
bgView.frame = view.bounds
gradientLayer.frame = bgView.bounds
}
}
推荐阅读
- django - django将父母添加到字段
- python - 从队列中的多个函数线程化和返回值
- css - 我希望菜单在按下按钮时从右侧滑入反应
- c# - 为什么在 .net5 上运行的 Function App 报告缺少/空的服务总线连接字符串?
- c# - 如何制作一个控制windows音量的TrackBar C#
- python-3.x - Python Pandas 从源(单列)获取数据以纠正表格格式
- .net - 如何在 .net 网站项目中使用 2 个不同的包版本
- java - 如何在对应java语法的python中实现相同的for循环
- sql - SQL查找使用同一帐户的多个用户
- python - 训练 keras LSTM 模型时“无法将 NumPy 数组转换为张量”