swift - 如何在 Swift 中为 UIButton 添加渐变?
问题描述
我已阅读其他问题和答案,但没有找到适合我的有效答案。
我正在使用此代码使用图层向 UIButton 添加渐变:
let gradient = CAGradientLayer()
gradient.colors = [UIColor.black.cgColor, UIColor.gray.cgColor]
gradient.locations = [0.0, 1.0]
myButton.setNeedsLayout() //I added this line then change next line to frame
gradient.frame = myButton.frame //I tried bounds
myButton.layer.insertSublayer(gradient, at: 0)
该按钮有时会显示出框架按钮的渐变。如果我将相同的代码应用于 UITabbar 而不是按钮,则会出现类似的问题,渐变 ins 并没有应用于所有帧......可能是什么问题?和解决方案?
Y 无法通过应用程序的架构从 layoutSubviews 加载渐变。
解决方案
要解决您的问题,您通常可以更改以下代码行,
gradient.frame = myButton.frame
至
gradient.frame = myButton.bounds
您遇到问题的原因是,当您使用视图/按钮的.frame
属性时,它提供了视图/按钮相对于其父视图的来源,可以是任何东西。
当您使用该.bounds
属性时,原点基于其自己的视图空间,大多数情况下都会将 (0,0) 点作为原点。但并非总是如此,这使我得出以下共识,
该解决方案在使用自动布局时可能仍会遇到问题,因为布局引擎可以在应用渐变后更改按钮的大小。
一个优雅的解决方案是拥有一个自定义按钮类,该类将应用于所有应用了渐变的按钮。当视图更新布局时,此类应调整渐变大小。
class GradientButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
updateGradientLayers()
}
private func updateGradientLayers() {
guard let sublayers = layer.sublayers else { return }
for layer in sublayers {
if let gradientView = layer as? CAGradientLayer {
gradientView.frame = bounds
}
}
}
}
推荐阅读
- php - (PHP SQL) 在 PHP 驱动的站点上使用 SQL 数据
- mysql - MySQL - 获取“超过锁定等待超时;尝试重新启动事务”
- scala - 如何将 spark 数据帧的每一行写入不同的 Hive 表(使用 Scala)?
- java - 如何在数组或列表中添加矩阵的行数和列数
- java - 内容小时将按钮固定在屏幕底部,如果内容大到足以占据整个屏幕,则将按钮固定在内容底部
- javascript - 为什么 javascript 看不到 style.filter 属性?
- dart - Dartlang 确实函数可以获取参数
- kubernetes - 如何在 kubernetes yaml 文件的环境变量中分配集群、命名空间和 pod 名称
- android - 如何获取可拖动标记的坐标 Google Maps Android API v2
- ruby-on-rails - Rspec不处理获取请求的参数