我在这个问题上停留了一段时间,虽然我认为我知道是什么问题,但仍然无法解决。我正在使用tableView,每个单元格都有倒计时栏动画。每个单元都有用户设置的自定义持续时间。然后,随着时间的流逝,条形动画就会滑动。
我正在使用CADisplayLink
来运行此动画,此代码已写入控制器文件中,而我只是随着时间的流逝而更改UIView的宽度:
@objc func handleProgressAnimation() {
let currenttime = Date()
let elapsed = currenttime.timeIntervalSince(animationStartDate)
let totalWidth: Double = 400.0
print(elapsed)
let arrayLength = durationBar.count
var i: Int = 0
for _ in 0..<arrayLength {
let indexPath = IndexPath(row: i, section: 0)
let percentage = (elapsed / Double(durationBar[i].durationTime))
let newWidth = Double(totalWidth - (totalWidth * percentage))
durationBar[i].width = newWidth
if (percentage < 1)
{
if let cell = listTableView.cellForRow(at: indexPath) as! listTableViewCell? {
cell.timeRemainingView.frame.size.width = CGFloat(durationBar[indexPath.row].width)
}
}
else {
if let cell = listTableView.cellForRow(at: indexPath) as! listTableViewCell? {
cell.timeRemainingView.frame.size.width = 400
cell.timeRemainingView.isHidden = true
}
}
i = i + 1
}
}
当所有小节都减少时,一切都会好起来,但是当其中一个单元格的时间完成时,UIView宽度将变为零,然后当用户滚动该单元格被重用时,进度条将从存在其他单元格的地方消失还是时间。
我正在使用prepareforsegue()方法将条形的宽度重置为400(默认值),但这似乎不起作用。
这是cellforRow
代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellid, for: indexPath) as! listTableViewCell
cell.testlabel.text = "\(duration[indexPath.row].durationTime)"
cell.timeRemainingView.frame.size.width = CGFloat(durationBar[indexPath.row].width)
return cell
}
这是PrepareForReuse()
override func prepareForReuse() {
super.prepareForReuse()
self.timeRemainingView.frame.size.width = 400
self.timeRemainingView.isHidden = false
}
这是屏幕截图。您可以在某些单元格中看到时间到了,但是在其他单元格中仍然有剩余时间,但是进度条消失了。
答案 0 :(得分:1)
您必须重新设置框架。 宽度是一个仅获取属性。