如何在 UITableViewCell 上使用 CAGradientLayers
How to use CAGradientLayers on UITableViewCell
我 运行 在我的 UITableViewCells 上使用 CAGradientLayers 遇到了问题。我试图做的是模拟 actionsForRowAtIndexPath 的作用,但我想使用自定义操作视图而不是仅仅设置背景颜色。
所以,我的行动计划是在我的 UITableViewCell 中,我已经布置了一个 UIView(操作视图),它隐藏在另一个 UIView(主要内容视图)下面,这两个 UIView 都在 UITableViewCell 的默认 contentView 中。
所以在我的 'cellForRowAt' tableView 函数中,我有这样的代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
// Set Up Gradient
let actionGradient = CUSTOM_GRADIENTS.blueToGreen!
actionGradient.frame = cell.actionView.frame
// Add Gradient to ActionView
cell.actionView.insertSubLayer(actionGradient, at: 0)
return cell
}
仅供参考,我的 CUSTOM_GRADIENTS 是在 ApplicationDelegate 中初始化的 class:
class safeGradiants {
var blueToGreen: CAGradientLayer!
init() {
self.blueToGreen = CAGradientLayer()
self.blueToGreen.colors = [UIColor.blue, UIColor.]
self.blueToGreen.startPoint = CGPoint(x: 0.0, y: 0.5)
self.blueToGreen.endPoint = CGPoint(x: 1.0, y: 0.5)
}
}
错误发生在加载我的 table 视图时,唯一具有渐变的单元格是 table 视图中的最后一个单元格。我只能假设这与细胞的重用有关,但我终究无法弄清楚如何修复它。
关于我需要做什么才能在所有单元格的 actionView 上显示此渐变有什么想法吗?
经过一番折腾,我发现我的问题出在我的 safeGradients class 上。由于我使用的是 class 的一个全局实例,因此我无法重用相同的变量 blueToGreen。
解决这个问题的方法不是创建一个 class 并拥有一个 class 的全局实例,而是创建一个承载子 class 函数的 CAGradientLayer 扩展。换句话说,我更改了这段代码:
class safeGradiants {
var blueToGreen: CAGradientLayer!
init() {
self.blueToGreen = CAGradientLayer()
self.blueToGreen.colors = [UIColor.blue, UIColor.]
self.blueToGreen.startPoint = CGPoint(x: 0.0, y: 0.5)
self.blueToGreen.endPoint = CGPoint(x: 1.0, y: 0.5)
}
}
进入此代码:
extension CAGradientLayer {
class var blueToGreen: CAGradientLayer {
let blueToGreen = CAGradientLayer()
blueToGreen.colors = [UIColor.blue, UIColor.green]
blueToGreen.startPoint = CGPoint(x: 0.0, y: 0.5)
blueToGreen.endPoint = CGPoint(x: 1.0, y: 0.5)
return blueToGreen
}
}
我 运行 在我的 UITableViewCells 上使用 CAGradientLayers 遇到了问题。我试图做的是模拟 actionsForRowAtIndexPath 的作用,但我想使用自定义操作视图而不是仅仅设置背景颜色。
所以,我的行动计划是在我的 UITableViewCell 中,我已经布置了一个 UIView(操作视图),它隐藏在另一个 UIView(主要内容视图)下面,这两个 UIView 都在 UITableViewCell 的默认 contentView 中。
所以在我的 'cellForRowAt' tableView 函数中,我有这样的代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
// Set Up Gradient
let actionGradient = CUSTOM_GRADIENTS.blueToGreen!
actionGradient.frame = cell.actionView.frame
// Add Gradient to ActionView
cell.actionView.insertSubLayer(actionGradient, at: 0)
return cell
}
仅供参考,我的 CUSTOM_GRADIENTS 是在 ApplicationDelegate 中初始化的 class:
class safeGradiants {
var blueToGreen: CAGradientLayer!
init() {
self.blueToGreen = CAGradientLayer()
self.blueToGreen.colors = [UIColor.blue, UIColor.]
self.blueToGreen.startPoint = CGPoint(x: 0.0, y: 0.5)
self.blueToGreen.endPoint = CGPoint(x: 1.0, y: 0.5)
}
}
错误发生在加载我的 table 视图时,唯一具有渐变的单元格是 table 视图中的最后一个单元格。我只能假设这与细胞的重用有关,但我终究无法弄清楚如何修复它。
关于我需要做什么才能在所有单元格的 actionView 上显示此渐变有什么想法吗?
经过一番折腾,我发现我的问题出在我的 safeGradients class 上。由于我使用的是 class 的一个全局实例,因此我无法重用相同的变量 blueToGreen。
解决这个问题的方法不是创建一个 class 并拥有一个 class 的全局实例,而是创建一个承载子 class 函数的 CAGradientLayer 扩展。换句话说,我更改了这段代码:
class safeGradiants {
var blueToGreen: CAGradientLayer!
init() {
self.blueToGreen = CAGradientLayer()
self.blueToGreen.colors = [UIColor.blue, UIColor.]
self.blueToGreen.startPoint = CGPoint(x: 0.0, y: 0.5)
self.blueToGreen.endPoint = CGPoint(x: 1.0, y: 0.5)
}
}
进入此代码:
extension CAGradientLayer {
class var blueToGreen: CAGradientLayer {
let blueToGreen = CAGradientLayer()
blueToGreen.colors = [UIColor.blue, UIColor.green]
blueToGreen.startPoint = CGPoint(x: 0.0, y: 0.5)
blueToGreen.endPoint = CGPoint(x: 1.0, y: 0.5)
return blueToGreen
}
}