我如何知道默认功能动画何时结束



在我的应用程序中,我在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()
}
}
}
}

UITableViewUIScrollView的一个子类。

您应该能够在表视图委托(通常是所属的视图控制器(中实现UIScrollViewDelegate方法scrollViewDidEndScrollingAnimation(_:),然后在该方法的实现中高亮显示该行。(您可能需要添加逻辑和状态变量来跟踪您处于这种情况的事实。(

编辑:

请注意,正如HangerRash链接的@trndjc的答案中所提到的,您应该从对Dispatch.main.async()的调用中获得后续动画代码。(这将有助于避免动画中的口吃。(

根据这个答案:

其次,尽管该方法是在主线程上调用的,但如果您在这里运行后续动画(滚动完成后的一个(,它仍然会出现问题(这可能是UIKit中的错误,也可能不是(。因此,只需将任何后续动画分派回主队列,即可确保动画将在当前主任务(似乎包括滚动到行的动画(结束后开始。这样做会给你一种真正完成的感觉。

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
DispatchQueue.main.async {
// execute subsequent animation here
}
}

最新更新