UITableView scrollToRow no longer works on iOS 11 right after adding a new row

前端 未结 5 2122
没有蜡笔的小新
没有蜡笔的小新 2021-02-20 12:22

I\'ve noticed a weird UITableView behaviour which only seems to occur on iOS 11 devices.

Right after inserting a new row (changing data source and then calling reloadDat

相关标签:
5条回答
  • 2021-02-20 13:13
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    
        [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    });
    

    Adding a small delay is working in my case.

    0 讨论(0)
  • 2021-02-20 13:16

    Are you calling scrollToRow() in viewDidAppear?

    Moving the function call from viewWillAppear to viewDidAppear worked for me.

    0 讨论(0)
  • 2021-02-20 13:23

    Accepted answer in Swift 4 syntax

    let deadlineTime = DispatchTime.now() + .seconds(1)
                    DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
                        self.tableView.scrollToRow(at: indexPath, at: .middle, animated: true)
                    }
    
    0 讨论(0)
  • 2021-02-20 13:25

    Not sure if the situation I encountered applies to this question, but I also had a situation where UITableView.scrollTo... started misbehaving from iOS 11.

    In my case, I was calling UITableView.reload... and UITableView.scrollTo... consecutively. And what it turned out is that the order matters.

    This works :

    tableView.reloadData()
    tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    

    This doesn't :

    tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    tableView.reloadData()
    

    Hopefully this helps.

    0 讨论(0)
  • 2021-02-20 13:26

    Just DispatchQueue.main.async works for me.

    0 讨论(0)
提交回复
热议问题