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

Sti*_*Sti 6 uitableview uiview uiviewanimation ios

我有一个正常UITableView的我UIViewController,约束到全屏.此tableView具有自定义交互式tableHeaderView.tableHeaderView的大小是动态的,并且可以自行扩展.headerView有一个textField,并且会根据textField是否具有焦点而改变自己的大小.

问题是当更改tableHeaderView的大小时,屏幕底部的单元格并不总是正确动画.我打电话tableView.beginUpdates()tableView.endUpdates()之后layoutIfNeeded()我的动画块内.必须这样做,否则单元格根本不会遵循动态大小.

我做了这个gif.在动画期间专门查看底部单元格.我已经大大放慢了动画的速度,因此很容易看到问题所在.

问题的GIF

推测:在我看来,就像cellForRow:indexPath:动画启动时tableView调用一样,并以某种方式找出动画后整个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
}
Run Code Online (Sandbox Code Playgroud)

jes*_*sse 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
}
Run Code Online (Sandbox Code Playgroud)