在UITableView动画期间,单元格消失

时间:2017-01-30 09:59:00

标签: ios uitableview uiview uiviewanimation

我的UITableView中有一个正常UIViewController,限制为全屏。此tableView具有自定义交互式tableHeaderView。 tableHeaderView的大小是动态的,并且可以自行扩展。 headerView有一个textField,它将根据textField是否具有焦点而改变自己的大小。

问题在于,在更改tableHeaderView的大小时,屏幕底部的单元格并不总是正确动画。 我在动画块中tableView.beginUpdates()之后调用了tableView.endUpdates()layoutIfNeeded()。必须这样做,否则细胞根本不会遵循动态大小。

我已经制作了这个GIF。在动画期间专门查看底部单元格。我已经大大减慢了动画的速度,因此很容易看到问题。

gif of problem

推测:在我看来,就像动画启动时tableView调用cellForRow:indexPath:一样,并以某种方式找出动画后整个tableView将处于什么状态,并删除不必要的单元格,即使动画还没有完成。 以同样的方式,当折叠标题时:最底层的单元格不像已经加载的单元格那样动画。它们使用不同的动画制作动画。

为什么会这样?这是可以预防的吗?

编辑:动画代码

self.navigationController?.setNavigationBarHidden(isEditing, animated: true)

var frame = tableHeaderView.frame
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing)

UIView.animate(withDuration: 0.3, animations: {

    if isEditing{
        let point = CGPoint(x: 0, y: -self.topLayoutGuide.length)
        self.tableView.setContentOffset(point, animated: false)
    }    

    tableHeaderView.frame = frame
    tableHeaderView.layoutIfNeeded()
    self.view.layoutIfNeeded()
    self.tableView.beginUpdates()
    self.tableView.endUpdates()
}) { [weak self](completed:Bool) in
    //Do stuff
}

2 个答案:

答案 0 :(得分:1)

我刚刚从Apple开发者技术支持团队那里听到了关于这个问题的回复,这里是他们的回复(强调我的)

  

你好尼古拉斯,

     

感谢您与Apple开发者技术支持(DTS)联系。

     

您描述的行为和产生的限制是设计使然。

     

如果您认为Apple应考虑采用其他方法,   我们建议您提交包含相关信息的增强请求   这个设计决定如何影响您,以及您希望看到的内容   不同。

     

虽然没有承诺会改变行为,但确实如此   确保你对此事的看法的最好方法是看到   负责决定的团队。

     

最诚挚的问候,

     

Apple开发者技术支持

我们似乎只是不得不使用tableView.setContentOffset(_:animated:)tableView.scrollToRow(at:at:animated:)进行简单的调用。

答案 1 :(得分:0)

好的,我会尝试提出我的版本,但我无法检查,因为我没有看到你的项目。我没有尝试编译它,所以它可能有错误。

var navFrame = self.navigationController?.navigationBar.frame
navFrame.origin.y = isEditing ? -navFrame.size.height : 0

var frame = tableHeaderView.frame
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing)

UIView.animate(withDuration: 0.3, animations: {
    if isEditing{
        let point = CGPoint(x: 0, y: -self.topLayoutGuide.length)
        self.tableView.contentOffset = point
    }

    self.navigationController?.navigationBar.frame = navFrame

    tableHeaderView.frame = frame

    self.view.layoutIfNeeded()
}) { [weak self](completed:Bool) in
    //Do stuff
}