UITableViewCell 的层在 heightForRowAt IndexPath 之后没有更新
UITableViewCell's layer not getting updated after heightForRowAt IndexPath
我正在更改每个 TableViewCell 的大小:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60
}
然后,在自定义单元格 class 中,我插入一个 'gradientLayer' 作为单元格层的子层 属性:
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
...
gradientLayer.frame = self.layer.bounds
layer.insertSublayer(gradientLayer, at: 0)
...
}
但是,渐变没有填满整个单元格:
有谁知道这是为什么happening/how我可以解决吗?
谢谢。
如果你使用普通的 UITableViewCell
:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100.0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath)
// ...
let gradient = CAGradientLayer()
gradient.frame = cell.contentView.frame
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
gradient.locations = [0.0, 1.0]
cell.contentView.layer.insertSublayer(gradient, at: 0)
// ...
return cell
}
您需要确保将渐变添加到 contentView 的图层。
这样就可以了。
如果使用自定义 UITableViewCell
class :
现在,如果您使用的是自定义单元格 class,您将需要 覆盖 layoutSubviews()
方法,如下所示:
override func layoutSubviews() {
super.layoutSubviews()
gradient.frame = contentView.frame
}
这可确保您的渐变框架在任何时候始终等于您的 contentView 框架。
您的自定义单元格 class 将如下所示:
class CustomTableCell: UITableViewCell {
lazy var gradient : CAGradientLayer = {
var gradient = CAGradientLayer()
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
gradient.locations = [0.0, 1.0]
self.contentView.layer.insertSublayer(gradient, at: 0)
return gradient
}()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// ...
}
override func layoutSubviews() {
super.layoutSubviews()
// ...
gradient.frame = contentView.frame
// ...
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// ...
}
}
如果您还有其他问题,请告诉我!
初始时的帧大小是单元格的默认帧,来自故事板或任何地方。它不会有你的 60 高度(除非匹配),因为单元格只是在 init 中创建,然后 然后 它会被调整大小。
您可以在那里添加层,但在 layoutSubviews 中调整大小或使用约束自动布局。如果这样做,渐变将以最终大小填充单元格。
为什么会这样?我不知道。
但是如果你把渐变放在你的 tableview 中 cellForRowAt
,你会得到:
代码如下:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let gradient: CAGradientLayer = CAGradientLayer()
gradient.colors = [UIColor.blue.cgColor, UIColor.red.cgColor]
gradient.frame = CGRect(x: 0.0, y: 0.0, width: cell.frame.size.width, height: cell.frame.size.height)
cell.layer.insertSublayer(gradient, at: 0)
return cell
}
我正在更改每个 TableViewCell 的大小:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60
}
然后,在自定义单元格 class 中,我插入一个 'gradientLayer' 作为单元格层的子层 属性:
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
...
gradientLayer.frame = self.layer.bounds
layer.insertSublayer(gradientLayer, at: 0)
...
}
但是,渐变没有填满整个单元格:
有谁知道这是为什么happening/how我可以解决吗?
谢谢。
如果你使用普通的 UITableViewCell
:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100.0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath)
// ...
let gradient = CAGradientLayer()
gradient.frame = cell.contentView.frame
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
gradient.locations = [0.0, 1.0]
cell.contentView.layer.insertSublayer(gradient, at: 0)
// ...
return cell
}
您需要确保将渐变添加到 contentView 的图层。
这样就可以了。
如果使用自定义 UITableViewCell
class :
现在,如果您使用的是自定义单元格 class,您将需要 覆盖 layoutSubviews()
方法,如下所示:
override func layoutSubviews() {
super.layoutSubviews()
gradient.frame = contentView.frame
}
这可确保您的渐变框架在任何时候始终等于您的 contentView 框架。
您的自定义单元格 class 将如下所示:
class CustomTableCell: UITableViewCell {
lazy var gradient : CAGradientLayer = {
var gradient = CAGradientLayer()
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
gradient.locations = [0.0, 1.0]
self.contentView.layer.insertSublayer(gradient, at: 0)
return gradient
}()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// ...
}
override func layoutSubviews() {
super.layoutSubviews()
// ...
gradient.frame = contentView.frame
// ...
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// ...
}
}
如果您还有其他问题,请告诉我!
初始时的帧大小是单元格的默认帧,来自故事板或任何地方。它不会有你的 60 高度(除非匹配),因为单元格只是在 init 中创建,然后 然后 它会被调整大小。
您可以在那里添加层,但在 layoutSubviews 中调整大小或使用约束自动布局。如果这样做,渐变将以最终大小填充单元格。
为什么会这样?我不知道。
但是如果你把渐变放在你的 tableview 中 cellForRowAt
,你会得到:
代码如下:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let gradient: CAGradientLayer = CAGradientLayer()
gradient.colors = [UIColor.blue.cgColor, UIColor.red.cgColor]
gradient.frame = CGRect(x: 0.0, y: 0.0, width: cell.frame.size.width, height: cell.frame.size.height)
cell.layer.insertSublayer(gradient, at: 0)
return cell
}