向 tableview 添加渐变会隐藏内容
Adding a gradient to a tableview hides content
我有一个 tableview,它运行良好。但我必须在背景上添加渐变。我在 viewDidLoad:
中使用此代码完成了此操作
gradientLayer.frame = self.view.bounds
let color1 = UIColor.blueColor().CGColor as CGColorRef
let color2 = UIColor.redColor().CGColor as CGColorRef
gradientLayer.colors = [color1, color2]
gradientLayer.locations = [0.0, 1.0]
gradientLayer.startPoint = CGPoint(x: 1, y: 0)
gradientLayer.endPoint = CGPoint(x: 0, y: 0)
self.view.layer.addSublayer(gradientLayer)
self.view.backgroundColor = UIColor.greenColor()
但现在我在 tableview 中看不到任何内容。
要适当配置背景渐变,您可以使用 backgroundView
属性 of UITableView
和 CAGradientLayer
的视图。结果代码(在 Swift 3 中)将是:
/* A small UIView subclass displaying gradient */
class GradientView: UIView {
/* Overriding default layer class to use CAGradientLayer */
override class var layerClass: AnyClass {
return CAGradientLayer.self
}
/* Handy accessor to avoid unnecessary casting */
private var gradientLayer: CAGradientLayer {
return layer as! CAGradientLayer
}
/* Public properties to manipulate colors */
public var fromColor: UIColor = UIColor.red {
didSet {
var currentColors = gradientLayer.colors
currentColors![0] = fromColor.cgColor
gradientLayer.colors = currentColors
}
}
public var toColor: UIColor = UIColor.blue {
didSet {
var currentColors = gradientLayer.colors
currentColors![1] = toColor.cgColor
gradientLayer.colors = currentColors
}
}
/* Initializers overriding to have appropriately configured layer after creation */
override init(frame: CGRect) {
super.init(frame: frame)
gradientLayer.colors = [fromColor.cgColor, toColor.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
gradientLayer.colors = [fromColor.cgColor, toColor.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
}
}
/* Code that should be called in viewDidLoad method */
class MyViewController: UITableViewController {
/* ... */
override func viewDidLoad() {
super.viewDidLoad()
tableView.backgroundView = GradientView()
}
/* ... */
}
我有一个 tableview,它运行良好。但我必须在背景上添加渐变。我在 viewDidLoad:
中使用此代码完成了此操作gradientLayer.frame = self.view.bounds
let color1 = UIColor.blueColor().CGColor as CGColorRef
let color2 = UIColor.redColor().CGColor as CGColorRef
gradientLayer.colors = [color1, color2]
gradientLayer.locations = [0.0, 1.0]
gradientLayer.startPoint = CGPoint(x: 1, y: 0)
gradientLayer.endPoint = CGPoint(x: 0, y: 0)
self.view.layer.addSublayer(gradientLayer)
self.view.backgroundColor = UIColor.greenColor()
但现在我在 tableview 中看不到任何内容。
要适当配置背景渐变,您可以使用 backgroundView
属性 of UITableView
和 CAGradientLayer
的视图。结果代码(在 Swift 3 中)将是:
/* A small UIView subclass displaying gradient */
class GradientView: UIView {
/* Overriding default layer class to use CAGradientLayer */
override class var layerClass: AnyClass {
return CAGradientLayer.self
}
/* Handy accessor to avoid unnecessary casting */
private var gradientLayer: CAGradientLayer {
return layer as! CAGradientLayer
}
/* Public properties to manipulate colors */
public var fromColor: UIColor = UIColor.red {
didSet {
var currentColors = gradientLayer.colors
currentColors![0] = fromColor.cgColor
gradientLayer.colors = currentColors
}
}
public var toColor: UIColor = UIColor.blue {
didSet {
var currentColors = gradientLayer.colors
currentColors![1] = toColor.cgColor
gradientLayer.colors = currentColors
}
}
/* Initializers overriding to have appropriately configured layer after creation */
override init(frame: CGRect) {
super.init(frame: frame)
gradientLayer.colors = [fromColor.cgColor, toColor.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
gradientLayer.colors = [fromColor.cgColor, toColor.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
}
}
/* Code that should be called in viewDidLoad method */
class MyViewController: UITableViewController {
/* ... */
override func viewDidLoad() {
super.viewDidLoad()
tableView.backgroundView = GradientView()
}
/* ... */
}