ios - 使用自动布局将渐变颜色应用于情节提要视图
问题描述
我在情节提要中添加了一个 UIView 并希望使用渐变颜色设置其背景。这是我的代码
extension UIView {
func setGradientBackground(colors: [CGColor]) {
let gradientLayer = CAGradientLayer()
gradientLayer.colors = colors
gradientLayer.locations = [0.0, 1.0]
gradientLayer.frame = self.bounds
self.layer.insertSublayer(gradientLayer, at:0)
}
}
在视图控制器中,
viewSocial.setGradientBackground(colors: [UIColor.gradientBottomColor.cgColor, UIColor.gradientTopColor.cgColor])
但这会创建双梯度层。 看图片
我已经尝试为 GradientLayer 添加一个类,如此处所述。但这不允许从情节提要中设置视图。给出弱变量的警告。
解决方案
这是制作@IBDesignable
渐变视图的一种方法。它使用默认的从上到下的渐变方向:
@IBDesignable
class MyGradientView: UIView {
@IBInspectable var color1: UIColor = .red {
didSet { setNeedsDisplay() }
}
@IBInspectable var color2: UIColor = .yellow {
didSet { setNeedsDisplay() }
}
private var gradientLayer: CAGradientLayer!
override class var layerClass: AnyClass {
return CAGradientLayer.self
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
func commonInit() -> Void {
// use self.layer as the gradient layer
gradientLayer = self.layer as? CAGradientLayer
gradientLayer.colors = [color1.cgColor, color2.cgColor]
}
override func layoutSubviews() {
super.layoutSubviews()
gradientLayer.colors = [color1.cgColor, color2.cgColor]
}
}
它具有@IBInspectable
“color1”和“color2”的变量......在属性检查器中更改它们将反映在情节提要中。
不需要任何额外的代码,例如您当前的方法setGradientBackground()
推荐阅读
- node.js - 如果不存在任何值,我如何捕捉承诺错误?
- java - 对于早期版本的 Java,在 Java 9 `Matcher#replaceAll(Function)` 中添加的替代方法是什么?
- php - PHP如何在for循环中操作变量并返回它
- angular - 在 Angular 7 中安装 devDependencies 或依赖项
- discord.js - 如何将 JSON 文件中的数字递减到 0?
- angular - 离子 4 中的错误是“无法读取 null 的属性‘联系人’”
- python-3.x - 如何从数据框中删除重复项并使用每个样本的权重创建新的?
- java - 我在哪里可以找到要导入和使用的“org.terrier.realtime.memory.MemoryIndex”类?
- php - PHP 邮件程序不适用于 CWP(控制 Web 面板 CentOs)电子邮件设置
- html - 循环(更改日期)从网站中提取数据到工作表