swift 我如何知道默认功能动画何时完成?

fcg9iug3  于 2022-12-02  发布在  Swift
关注(0)|答案(1)|浏览(101)

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

pftdvrlh1#

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

编辑:

请注意,正如the answer from @trndjc linked by HangerRash中所提到的,您应该通过调用Dispatch.main.async()来编写后续的动画代码。(这将有助于避免动画中出现停顿。)
从那回答:
其次,尽管方法是在主线程上调用的,但如果您在此处运行后续动画(卷轴完成后一次),仍会挂起(这可能是UIKit中的bug,也可能不是)。因此,简单地将任何后续动画分派回主队列,这仅确保动画将在当前主任务结束后开始(它似乎包括滚动到行的动画)。这样做会给予你一个真正完成的外观。

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

相关问题