kya*_*ing 5 xcode uibutton ios cagradientlayer swift
我已经查看了类似问题的许多其他答案,但似乎没有一个答案可以解决我的问题,因此寻求一些帮助。
我正在尝试将垂直渐变应用于 UIButton,但渐变层没有显示在我的视图中。这是相关代码:
let darkPurple = UIColor(displayP3Red: 61.0/255.0, green: 3.0/255.0, blue: 110.0/255.0, alpha: 1.0)
let lightPurple = UIColor(displayP3Red: 90.0/255.0, green: 32.0/255.0, blue: 130.0/255.0, alpha: 1.0)
let addButton = UIButton(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
addButton.title = "Start counting"
addButton.layer.cornerRadius = 30.0
addButton.layer.borderWidth = 1.0
addButton.layer.borderColor = darkPurple.cgColor
addButton.translatesAutoresizingMaskIntoConstraints = false
myView.addSubview(addButton)
addButton.applyGradient(with: [lightPurple, darkPurple], gradientOrientation: .vertical)
Run Code Online (Sandbox Code Playgroud)
...以及应用渐变的代码:
typealias GradientPoints = (startPoint: CGPoint, endPoint: CGPoint)
enum GradientOrientation {
case topRightBottomLeft
case topLeftBottomRight
case horizontal
case vertical
var startPoint: CGPoint {
return points.startPoint
}
var endPoint: CGPoint {
return points.endPoint
}
var points: GradientPoints {
switch self {
case .topRightBottomLeft:
return (CGPoint(x: 0.0, y: 1.0), CGPoint(x: 1.0, y: 0.0))
case .topLeftBottomRight:
return (CGPoint(x: 0.0, y: 0.0), CGPoint(x: 1.0, y: 1.0))
case .horizontal:
return (CGPoint(x: 0.0, y: 0.0), CGPoint(x: 1.0, y: 0.0))
case .vertical:
return (CGPoint(x: 0.0, y: 0.0), CGPoint(x: 0.0, y: 1.0))
}
}
}
extension UIView {
func applyGradient(with colors: [UIColor], gradientOrientation orientation: GradientOrientation) {
let gradient = CAGradientLayer()
gradient.frame = self.bounds
gradient.colors = colors.map { $0.cgColor }
gradient.startPoint = orientation.startPoint
gradient.endPoint = orientation.endPoint
gradient.borderColor = self.layer.borderColor
gradient.borderWidth = self.layer.borderWidth
gradient.cornerRadius = self.layer.cornerRadius
gradient.masksToBounds = true
gradient.isHidden = false
self.layer.insertSublayer(gradient, at: 0)
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我得到的: 空按钮
感谢您的帮助!
Dim*_*ira 18
对于那些已经花了几个小时搜索的人(就像我一样):
确保您的颜色数组包含CGColor而不是UIColor按照文档:
颜色
定义每个渐变停止点颜色的 CGColorRef 对象数组。可动画。
https://developer.apple.com/documentation/quartzcore/cagradientlayer/1462403-colors
奖励:如果您再次错过这个小代码片段,应用程序将会崩溃(#if DEBUG建议使用)
extension CAGradientLayer {
dynamic var colors: [Any]? {
get { self.value(forKey: "colors") as? [Any] }
set {
if let newValue = newValue {
for color in newValue {
if color is UIColor {
fatalError("CAGradientLayer.colors must contain only CGColor! UIColor was found")
}
}
}
super.setValue(newValue, forKey: "colors")
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 3
自动布局不会影响对象的图层,因此在计算UIView框架之前过早应用渐变图层。UIButton当frame渐变层的属性被赋值后,按钮的边界仍然等于CGRect.zero,并且渐变层框架以后不再更新。
您会发现,如果在计算按钮框架后添加渐变图层,它将按预期工作。例如:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let darkPurple = UIColor(displayP3Red: 61.0/255.0, green: 3.0/255.0, blue: 110.0/255.0, alpha: 1.0)
let lightPurple = UIColor(displayP3Red: 90.0/255.0, green: 32.0/255.0, blue: 130.0/255.0, alpha: 1.0)
addButton.applyGradient(with: [lightPurple, darkPurple], gradientOrientation: .vertical)
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是更新frame渐变层的属性,viewDidLayoutSubviews()或者创建自定义UIButton子类,并在按钮框架更新时更新渐变层框架。
| 归档时间: |
|
| 查看次数: |
3792 次 |
| 最近记录: |