在我的应用程序中,我在tableView中列出了按日期排序的已发送通知。如果用户点击设备通知屏幕上的通知,应用程序会突出显示行。但在用户按下设备主屏幕上的通知之前,如果用户向tableView的末尾滚动,当用户按下通知时,应用程序会将tableView滚动到动画显示的行,并突出显示该行。
但是如果用户将contentView滚动到tableView的末尾,高亮显示就不起作用了。我认为滚动到行的动画功能和高亮显示动画功能是同时起作用的。
我如何能捕捉到tableView.scrollToRow(at: indexPath, at: .bottom, animated: true)
动画何时结束。如果我知道scrollToRow动画何时结束,我就可以在之后运行高亮行代码。
- 谢谢-谢谢
DispatchQueue.main.async {
self.tableView.scrollToRow(at: indexPath, at: .bottom, animated: true)
if let cell = self.tableView.cellForRow(at: indexPath) as? NewsItemCell {
let highlightView = UIView.init(frame: cell.contentView.frame)
highlightView.backgroundColor = .white
highlightView.alpha = 0.0
cell.contentView.addSubview(highlightView)
print(indexPath)
UIView.animate(withDuration: 1.0, delay: 0, options: .curveEaseIn) {
highlightView.alpha = 1.0
} completion: { Bool in
UIView.animate(withDuration: 1.5, delay: 0, options: .curveEaseOut) {
highlightView.alpha = 0.0
} completion: { Bool in
highlightView.removeFromSuperview()
}
}
}
}
1条答案
按热度按时间pftdvrlh1#
UITableView
是UIScrollView
的子类。您应该能够在表视图委托(通常是视图控制器)中实现
UIScrollViewDelegate
方法scrollViewDidEndScrollingAnimation(_:)
,然后在实现该方法时突出显示该行(您可能需要添加逻辑和状态变量来跟踪您处于这种情况的事实)。编辑:
请注意,正如the answer from @trndjc linked by HangerRash中所提到的,您应该通过调用
Dispatch.main.async()
来编写后续的动画代码。(这将有助于避免动画中出现停顿。)从那回答:
其次,尽管方法是在主线程上调用的,但如果您在此处运行后续动画(卷轴完成后一次),仍会挂起(这可能是UIKit中的bug,也可能不是)。因此,简单地将任何后续动画分派回主队列,这仅确保动画将在当前主任务结束后开始(它似乎包括滚动到行的动画)。这样做会给予你一个真正完成的外观。