Swift ios 9: Section header change position after reload data

吃可爱长大的小学妹 提交于 2019-12-01 15:26:53

I know it's an old thread but uncheck the Adjust Scroll View Insets doesn't help. I had this problem and solved it by reload table twice.

tableView.reloadData()
tableView.layoutIfNeeded()
tableView.beginUpdates()
tableView.endUpdates()

This help me out.

Double reloadData will cause flickering while this solution won't.

Calling reloadData() twice also works for me, but I would suggest calling tableView.layoutSubviews() after reloadData(), which also works for me.

It looks like the issue in estimated height for your table view cells. Due to internal optimisations system calculates the height of absent cells based on estimated height value, that's why it can position your headers on wrong calculated height (like real cells bigger or smaller than their estimated size). It usually happens when you call reloadData() in the middle of the list. As a proper solution you should avoid calling reloadData() when you want to update the content of the list with second page for example. So you should use tableView.beginUpdates() and tableView.endUpdates() and update items collection for table view. There is also new closure based API performBatchUpdates (just like it was for UICollectionView), but it's available from iOS 11.

Hope it may help to find proper solution for you

This is because of UI viewcontroller property. Please first select UIViewController From Storyboard , Attribute Inspector

In my project ,this error happened when i pull up tableView to request more data then reload the data after requesting. I need create many sections after requesting the data and it may effect the performance if i reloadData twice. More than, i found that if i scroll up or down the tableView, the position of section's headerView get right. So i fix this bug(my condition) i requesting the data by this:

[_tableView reloadData];
CGPoint offSetOrigin     = _tableView.contentOffset;
CGPoint offSetSecond     = CGPointMake(0, offSet.y-1);
_tableView.contentOffset = offSetSecond;
_tableView.contentOffset = offSet;

The solutions here didn't fix my problem, so I'm leaving one more possible solution that helped me.

Set the estimatedSectionHeaderHeight, it seems that my tableView wasn't being able to calculate the initial position of my first section without it.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!